Bounded worker pool with graceful close
Go
package main
import (
"fmt"
"sync"
)
// StartPool launches `workers` goroutines consuming a jobs channel and
// returns a submit function plus a close function that waits for completion.
func StartPool(workers int, handle func(worker, job int)) (submit func(int), closePool func()) {
jobs := make(chan int)
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
for job := range jobs {
handle(id, job) // each job runs on exactly one worker
}
}(i)
}
return func(job int) { jobs <- job }, func() { close(jobs); wg.Wait() }
}
func main() {
submit, closePool := StartPool(3, func(worker, job int) {
fmt.Printf("worker %d handled job %d\n", worker, job)
})
for job := 1; job <= 6; job++ {
submit(job)
}
closePool()
}