Как работает механизм work-stealing в планировщике Go и какое количество горутин «воруется» за один раз?

Ответ

Work-stealing (воровство работы) — это ключевой механизм в планировщике Go для балансировки нагрузки между процессорами (P).

Алгоритм работы:

  1. Когда процессор P завершает выполнение своих горутин и его локальная очередь (runqueue) пустеет, он становится "вором".
  2. Сначала он проверяет глобальную очередь горутин.
  3. Если и она пуста, он выбирает случайный другой процессор (P-жертву).
  4. "Вор" блокирует очередь "жертвы" и забирает ровно половину горутин из нее в свою локальную очередь.

Количество:
Забирается n/2 горутин, где n — количество горутин в очереди у "жертвы". Целочисленное деление в Go автоматически округляет результат вниз.

// Сценарий:
// P1 (вор) имеет пустую очередь.
// P2 (жертва) имеет 7 горутин в очереди.
// P1 "ворует" у P2 -> 7 / 2 = 3 горутины.
//
// Результат:
// У P1 теперь 3 горутины для выполнения.
// У P2 осталось 4 горутины.

Цель механизма — минимизировать простои процессоров и обеспечить максимально эффективное и равномерное распределение работы по всем доступным ядрам.