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()
}