Ответ
Work-stealing (воровство работы) — это ключевой механизм в планировщике Go для балансировки нагрузки между процессорами (P).
Алгоритм работы:
- Когда процессор
P
завершает выполнение своих горутин и его локальная очередь (runqueue) пустеет, он становится "вором". - Сначала он проверяет глобальную очередь горутин.
- Если и она пуста, он выбирает случайный другой процессор (
P-жертву
). - "Вор" блокирует очередь "жертвы" и забирает ровно половину горутин из нее в свою локальную очередь.
Количество:
Забирается n/2
горутин, где n
— количество горутин в очереди у "жертвы". Целочисленное деление в Go автоматически округляет результат вниз.
// Сценарий:
// P1 (вор) имеет пустую очередь.
// P2 (жертва) имеет 7 горутин в очереди.
// P1 "ворует" у P2 -> 7 / 2 = 3 горутины.
//
// Результат:
// У P1 теперь 3 горутины для выполнения.
// У P2 осталось 4 горутины.
Цель механизма — минимизировать простои процессоров и обеспечить максимально эффективное и равномерное распределение работы по всем доступным ядрам.