Sobes.tech
Назад к вопросам
Senior
2

Как планировщик прерывает горутину, зашедшую в бесконечный цикл?

Компании, где спрашивали
А7

Ответ от нейросети

sobes.tech AI

В Go планировщик (scheduler) не прерывает горутину, которая зашла в бесконечный цикл, если она не делает системных вызовов или не вызывает функции, позволяющие планировщику переключить контекст (например, time.Sleep, runtime.Gosched, операции с каналами). Горутину можно считать «зависшей», если она не уступает управление, и планировщик не может её прервать принудительно.

Таким образом, если горутина в бесконечном цикле без вызовов, планировщик не сможет переключиться на другие горутины, что приведёт к блокировке. Чтобы избежать этого, в бесконечном цикле нужно явно вызывать runtime.Gosched() или использовать другие механизмы, позволяющие планировщику переключать выполнение.

Пример:

for {
    // ... работа
    runtime.Gosched() // уступаем планировщику
}