Что такое worker pool паттерн?

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

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).

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

Как остановить горутину?