Планировщик Go использует несколько механизмов для предотвращения истощения горутин:
-
Справедливость: Он нацелен на справедливое планирование, давая возможность запуститься всем работоспособным горутинам.
-
Вытеснение: Начиная с Go 1.14, планировщик имеет вытеснение по времени. Горутины, которые выполняются более определенного интервала времени (в настоящее время около 10 мс), вытесняются, чтобы позволить другим горутинам на том же P выполняться. Это предотвращает голодание одной горутины, связанной с процессором, других.
-
Кража работы: Как уже говорилось, кража работы помогает распределить горутины из перегруженных P в свободные.
-
Сценарии, когда голодание может все еще произойти:
-
Занятые циклы внутри Cgo: если горутина застревает в занятом цикле внутри кода C, вызываемого через Cgo, планировщик Go не может ее вытеснить, что потенциально приводит к голоданию других горутин на этом M.
-
Конфликт за ресурсы: Если горутина постоянно блокируется в ожидании ресурса (например, мьютекса), который удерживается в течение длительного времени другими goroutines, ему по-прежнему может не хватать этого ресурса, даже если планировщик выделяет ему процессорное время.
-
Патологические рабочие нагрузки/ошибки: Чрезвычайно редкие или ошибочные шаблоны кода теоретически могут привести к зависанию, но планировщик устойчив к большинству распространенных случаев.
Итог
Планировщик Go использует несколько механизмов для предотвращения истощения горутин:
- Справедливость: Он нацелен на справедливое планирование, давая возможность запуститься всем работоспособным горутинам.