Что такое worker pool?

Middle
1.2k просмотров
AFK Offer AI

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 — больше.

Следующий вопрос

Как устроена map в Go?