Какие знаешь очереди в планировщике Go

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

Ответ

В Go планировщик использует 3 типа очередей:

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