Worker pool — пул фиксированного числа горутин, которые обрабатывают задачи из общей очереди. Это ограничивает параллелизм и потребление ресурсов.
func workerPool(tasks <-chan Task, results chan<- Result, workers int) {
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for task := range tasks {
results <- process(task)
}
}()
}
wg.Wait()
close(results)
}
Зачем: если запускать горутину на каждый запрос без ограничений, при нагрузке 10к RPS получишь 10к горутин, каждая из которых лезет в БД или делает HTTP-запрос. Пул воркеров ограничивает конкурентность до разумного числа. Это как connection pool, только для вычислений. Размер пула подбирается под задачу: для CPU-bound — по числу ядер, для I/O-bound — больше.