Проверяет понимание управления жизненным циклом горутин и лимитов пула.
Безлимитное создание горутин приводит к утечкам памяти, росту нагрузки на планировщик и крашу по OOM. Ограничивать параллелизм нужно через worker pool, семафоры или буферизированные каналы.
Горутины лёгкие, но они НЕ бесплатные. Каждая начинается с ~2 KB стека и растёт по мере работы. Если создать тысячи горутин “без лимита”, возникают:
Утечки (goroutine leaks) — когда горутина блокируется на канале/IO навсегда.
Рост использования памяти — десятки тысяч горутин → сотни MB.
Перегрузка планировщика Go — runtime тратит много времени на управление M:N.
Out Of Memory — OS убивает процесс.
Ограничивать параллелизм можно:
worker pool (pool из фиксированного числа горутин):
pool := make(chan struct{}, 20)
for _, task := range tasks {
pool <- struct{}{}
go func(task ...) {
defer func(){ <-pool }()
work(task)
}()
}семафором
каналами фиксированной ёмкости
sizedwaitgroup
Пул горутин — единственно корректный способ обработки большого числа задач.