Понимание горутин
Worker pool — это фиксированное количество горутин, которые получают задачи из общего канала и обрабатывают их параллельно. Это ограничивает нагрузку и делает выполнение контролируемым.
Worker pool используется, когда нужно обрабатывать большое количество задач с контролем параллелизма. Суть:
Создаётся канал задач.
Запускается фиксированное количество воркеров (горутин).
Каждый воркер читает из канала и выполняет задачу.
Результаты можно передавать в отдельный канал или обрабатывать в месте получения.
Такой подход:
ограничивает количество активных горутин;
упрощает управление ресурсами;
повышает стабильность и предсказуемость нагрузки.
Worker pool особенно полезен для обработки запросов к БД, файловым системам и внешним API.
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("worker %d processing job %d\n", id, j)
results <- j * 2
}
}
func main() {
jobs := make(chan int, 5)
results := make(chan int, 5)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= 5; a++ {
fmt.Println("result:", <-results)
}
}