Ответ
В Go горутины — это легковесные потоки, управляемые рантаймом. Они работают поверх системных потоков (обычно 1 поток на ядро CPU).
Основные причины:
- Переключение контекста — если горутин больше, чем потоков, планировщик Go эффективно распределяет их, минимизируя накладные расходы.
- Блокирующие операции — если горутина блокируется (например, на I/O), другие горутины могут работать в этом же потоке.
- Оптимальное использование CPU — слишком много потоков могут привести к contention и избыточному переключению контекста ОС.
Пример:
// 1000 горутин на 4-ядерном CPU — нормально
for i := 0; i < 1000; i++ {
go func() {
// работа
}()
}