Worker pool — фиксированное количество горутин обрабатывает поток задач. Контролирует параллелизм и потребление ресурсов.
func workerPool(numWorkers int, jobs <-chan Job, results chan<- Result) {
var wg sync.WaitGroup
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
for job := range jobs {
result := process(job)
results <- result
}
}(i)
}
go func() {
wg.Wait()
close(results)
}()
}
// Использование
jobs := make(chan Job, 100)
results := make(chan Result, 100)
workerPool(5, jobs, results) // 5 воркеров
// Отправляем задачи
for _, j := range taskList {
jobs <- j
}
close(jobs) // сигнал воркерам: задач больше не будет
// Собираем результаты
for r := range results {
fmt.Println(r)
}
Плюсы: предсказуемое потребление памяти и CPU, контроль нагрузки на внешние сервисы, graceful shutdown через close(jobs).