Как будут планироваться несколько горутин на нескольких ядрах

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

Ответ

Планирование горутин на нескольких ядрах в Go управляется рантаймом и планировщиком (scheduler). Вот ключевые моменты:

  1. M:N модель - Go использует гибридную модель, где множество горутин (G) выполняются на множестве потоков ОС (M), привязанных к ядрам CPU.

  2. Work-stealing - если поток освобождается, он может "украсть" горутину из очереди другого потока.

  3. GOMAXPROCS - определяет максимальное количество потоков ОС, которые могут выполняться одновременно (по умолчанию равно количеству ядер CPU).

Пример:

runtime.GOMAXPROCS(4) // Используем 4 ядра
for i := 0; i < 10; i++ {
    go func(num int) {
        fmt.Println(num)
    }(i)
}
time.Sleep(time.Second) // Даем время на выполнение

Планировщик автоматически распределяет горутины по доступным ядрам, стараясь максимизировать параллелизм. Разработчику обычно не нужно управлять этим процессом вручную.