> Как реализовать worker pool для ограничения количества горутин в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

Для реализации worker pool в Go можно использовать буферизированный канал в качестве очереди задач и синхронизировать завершение через sync.WaitGroup. Вот пример:

GO
package main
import (
"fmt"
"sync"
"time"
)
type Task func()
func worker(id int, tasks <-chan Task, wg *sync.WaitGroup) {
defer wg.Done()
for task := range tasks {
fmt.Printf("Worker %d выполняет задачу\n", id)
task()
}
}
func main() {
const numWorkers = 3
tasks := make(chan Task, 10)
var wg sync.WaitGroup
// Запускаем фиксированное количество воркеров
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(i, tasks, &wg)
}
// Отправляем задачи
for i := 0; i < 5; i++ {
task := func() {
time.Sleep(100 * time.Millisecond)
fmt.Println("Задача выполнена")
}
tasks <- task
}
close(tasks) // Закрываем канал, чтобы воркеры завершились
wg.Wait() // Ждём завершения всех воркеров
}

Ключевые моменты:

  • Канал tasks буферизирован для асинхронной отправки задач.
  • Количество горутин ограничено числом numWorkers (в примере - 3).
  • close(tasks) сигнализирует воркерам о завершении работы.
  • sync.WaitGroup гарантирует, что main-горутина дождётся всех воркеров.

Этот паттерн эффективно контролирует параллелизм, предотвращая перегрузку системы.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью