Ответ
Планирование горутин на нескольких ядрах в Go управляется рантаймом и планировщиком (scheduler). Вот ключевые моменты:
-
M:N модель - Go использует гибридную модель, где множество горутин (G) выполняются на множестве потоков ОС (M), привязанных к ядрам CPU.
-
Work-stealing - если поток освобождается, он может "украсть" горутину из очереди другого потока.
-
GOMAXPROCS - определяет максимальное количество потоков ОС, которые могут выполняться одновременно (по умолчанию равно количеству ядер CPU).
Пример:
runtime.GOMAXPROCS(4) // Используем 4 ядра
for i := 0; i < 10; i++ {
go func(num int) {
fmt.Println(num)
}(i)
}
time.Sleep(time.Second) // Даем время на выполнение
Планировщик автоматически распределяет горутины по доступным ядрам, стараясь максимизировать параллелизм. Разработчику обычно не нужно управлять этим процессом вручную.