Почему нельзя запустить столько же горутин, сколько потоков

«Почему нельзя запустить столько же горутин, сколько потоков» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go горутины — это легковесные потоки, управляемые рантаймом. Они работают поверх системных потоков (обычно 1 поток на ядро CPU).

Основные причины:

  1. Переключение контекста — если горутин больше, чем потоков, планировщик Go эффективно распределяет их, минимизируя накладные расходы.
  2. Блокирующие операции — если горутина блокируется (например, на I/O), другие горутины могут работать в этом же потоке.
  3. Оптимальное использование CPU — слишком много потоков могут привести к contention и избыточному переключению контекста ОС.

Пример:

// 1000 горутин на 4-ядерном CPU — нормально
for i := 0; i < 1000; i++ {
    go func() {
        // работа
    }()
}