> Как реализовать worker pool для ограничения количества горутин в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
Для реализации worker pool в Go можно использовать буферизированный канал в качестве очереди задач и синхронизировать завершение через sync.WaitGroup. Вот пример:
GOpackage mainimport ("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 = 3tasks := 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-горутина дождётся всех воркеров.
Этот паттерн эффективно контролирует параллелизм, предотвращая перегрузку системы.
> Похожие задачи по Go
Как в Go встраивание заменяет наследование
Как остановить обработку после получения первых двух успешных запросов в Go
Как программа узнает об окончании списка URL и передает сигнал завершения
Как программа определяет URL для выполнения запросов по списку
> Похожие задачи по backend
Как в Go встраивание заменяет наследование
Как остановить обработку после получения первых двух успешных запросов в Go
Как программа узнает об окончании списка URL и передает сигнал завершения
Как программа определяет URL для выполнения запросов по списку
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью