Какой механизм планировщика позволяет брать горутину из глобальной очереди

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

Ответ

В Go планировщик использует work-stealing механизм для балансировки нагрузки между потоками (M). Если у потока нет локальных горутин (в локальной очереди), он пытается "украсть" горутину из глобальной очереди или из очереди другого потока.

Глобальная очередь (runq) — это общая FIFO-очередь для всех потоков. Доступ к ней синхронизируется через мьютекс.

Пример:

go func() { fmt.Println("Горутина в глобальной очереди") }()

Здесь анонимная горутина может попасть в глобальную очередь, если планировщик не сможет сразу выполнить её в текущем P.

Нюансы:

  • Глобальная очередь медленнее локальной (из-за блокировок).
  • Work-stealing снижает простои потоков.