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