Пул воркеров: ограничиваем параллелизм
Наивный подход — go на каждый элемент — может породить миллионы горутин и положить систему. Пул воркеров ограничивает число одновременных операций.
jobs := make(chan int, 100)
var wg sync.WaitGroup
for w := 0; w < 4; w++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := range jobs { process(j) }
}()
}Четыре воркера читают из общего канала jobs. Сколько бы задач ни пришло — параллельно выполняется не больше четырёх. WaitGroup дожидается завершения всех.
Число воркеров подбирают под задачу: для CPU-нагрузки — примерно по числу ядер, для сетевых операций можно больше.