package main
import (
"fmt"
"time"
)
type Task struct {
f func() error
}
type Pool struct {
numWorkers int
taskChan chan Task
quitChan chan struct{}
}
func NewPool(numWorkers int) *Pool {
pool := &Pool{
numWorkers: numWorkers,
taskChan: make(chan Task),
quitChan: make(chan struct{}),
}
for i := 0; i < numWorkers; i++ {
go pool.worker()
}
return pool
}
func (p *Pool) worker() {
for {
select {
case task := <-p.taskChan:
task.f()
case <-p.quitChan:
return
}
}
}
func (p *Pool) submit(task Task) {
p.taskChan <- task
}
func (p *Pool) stop() {
close(p.quitChan)
}
func main() {
pool := NewPool(2)
for i := 0; i < 10; i++ {
task := Task{
f: func() error {
fmt.Println("Executing task")
return nil
},
}
pool.submit(task)
}
time.Sleep(time.Second)
pool.stop()
}