Что произойдёт при запуске десяти тысяч потоков

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

Ответ

В Go нет потоков в классическом понимании, есть горутины (goroutines). Они легковесны (2-4 КБ стека) и управляются рантаймом.

При запуске 10к горутин:

  1. Они создадутся быстро (намного быстрее, чем системные потоки)
  2. Будут выполняться конкурентно, но не обязательно параллельно (зависит от GOMAXPROCS)
  3. Потребляют меньше памяти, чем потоки ОС
  4. Блокирующие операции (ввод/вывод) не блокируют потоки ОС благодаря неблокирующему IO и планировщику

Пример:

func main() {
    for i := 0; i < 10000; i++ {
        go func(n int) {
            fmt.Println(n)
        }(i)
    }
    time.Sleep(time.Second) // Даём время на выполнение
}

Проблемы могут возникнуть при:

  • Утечке горутин (если они не завершаются)
  • Чрезмерном потреблении CPU при активных вычислениях
  • Конкуренции за общие ресурсы (нужны sync примитивы)