Использовать пул воркеров (ограниченное число горутин), которые берут задачи из канала. Либо семафор через буферизованный канал для ограничения параллелизма. Не запускать 100k горутин без ограничения - возможны нехватка памяти и перегрузка планировщика.
jobs := make(chan int, 100)
for w := 0; w < 1000; w++ { go func() { for j := range jobs { do(j) } }() }
for j := 0; j < 100000; j++ { jobs <- j }
close(jobs)