Ответ
В Go планировщик (scheduler) автоматически распределяет горутины по доступным потокам ОС (обычно 1 поток на ядро). На 4 ядрах:
- По умолчанию Go использует GOMAXPROCS=количество_ядер (в данном случае 4)
- Каждая горутина может выполняться на любом ядре
- Распределение не гарантировано - зависит от нагрузки и работы планировщика
Пример:
runtime.GOMAXPROCS(4) // Явно задаем (не обязательно)
for i := 0; i < 4; i++ {
go func() {
// Работа горутины
}()
}
Горутины могут:
- Работать параллельно на разных ядрах
- Переключаться между ядрами
- Конкурировать за ресурсы
Для точного контроля распределения нужны низкоуровневые инструменты вроде runtime.LockOSThread()