package pool type Task interface { Execute(id int) } type Pool struct { tasks chan Task kill chan bool } func NewPool(size, queue int) *Pool { pool := &Pool{ tasks: make(chan Task, queue), kill: make(chan bool), } for i := 0; i < size; i++ { go pool.worker(i) } return pool } func (p *Pool) worker(id int) { for { select { case task, ok := <-p.tasks: if !ok { return } task.Execute(id) case <-p.kill: // should really kill it return } } } func (p *Pool) Close() { close(p.tasks) } func (p *Pool) Exec(task Task) { p.tasks <- task }