jobs := make(chan Job) var wg sync.WaitGroup for i := 0; i < runtime.NumCPU(); i++ { wg.Add(1) go func() { defer wg.Done() for j := range jobs { process(j) } }() } for _, j := range allJobs { jobs <- j } close(jobs) wg.Wait()