Ответ
В Go планировщик использует work-stealing механизм для балансировки нагрузки между потоками (M). Если у потока нет локальных горутин (в локальной очереди), он пытается "украсть" горутину из глобальной очереди или из очереди другого потока.
Глобальная очередь (runq) — это общая FIFO-очередь для всех потоков. Доступ к ней синхронизируется через мьютекс.
Пример:
go func() { fmt.Println("Горутина в глобальной очереди") }()
Здесь анонимная горутина может попасть в глобальную очередь, если планировщик не сможет сразу выполнить её в текущем P.
Нюансы:
- Глобальная очередь медленнее локальной (из-за блокировок).
- Work-stealing снижает простои потоков.