Вопрос проверяет навыки работы с горутинами.
Можно использовать семафор, реализованный через канал. Создаётся буферизированный канал, куда помещаются маркеры при запуске новой горутины, и освобождаются при завершении.
В Go для ограничения числа одновременно выполняемых горутин часто используют семафор, реализованный через буферизированный канал (chan struct{}).
Принцип работы:
Создаём канал sema := make(chan struct{}, N) — где N это максимально допустимое количество одновременных горутин.
Перед запуском каждой горутины записываем пустую структуру в канал.
По завершению горутина читает из канала, освобождая слот.
Пример:
sema := make(chan struct{}, 10) // максимум 10 горутин
for _, task := range tasks {
sema <- struct{}{}
go func(task Task) {
defer func() { <-sema }()
process(task)
}(task)
}Этот подход:
Лаконичен
Безопасен
Подходит для любых задач с ограничением по ресурсу (CPU, соединениям и т.д.)
Альтернатива — реализация через worker pool, где фиксированное количество воркеров получают задания через канал.