Вопрос проверяет практические навыки конкурентного программирования и умение управлять нагрузкой.
Worker pool — это набор фиксированных воркеров, которые получают задачи из канала и обрабатывают их параллельно. Ограничение по concurrency достигается размером пула.
Worker pool решает проблему управления количеством одновременно выполняемых задач. Вместо запуска тысячи горутин создаётся фиксированное число воркеров, которые берут задачи из канала.
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2 // обработка
}
}
func main() {
jobs := make(chan int, 10)
results := make(chan int, 10)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
for r := 1; r <= 5; r++ {
fmt.Println(<-results)
}
}Особенности:
Количество воркеров регулирует параллелизм.
Для graceful shutdown можно использовать context.Context.
При высоких нагрузках можно масштабировать размер пула динамически.
Вывод: Worker pool — базовый паттерн конкурентности в Go для ограниченного числа ресурсов.