Sobes.tech
Junior — Middle

Czy możliwa jest sytuacja, w której planista nie zmusza goroutine do ustąpienia wykonania?

sobes.tech AI

Odpowiedź od AI

W Go, planista gorutyn (scheduler) zazwyczaj sam zarządza przełączaniem między gorutynami, aby zapewnić równoczesne wykonywanie. Jednak może się zdarzyć, że gorutyna nie ustępuje, jeśli wykonuje długą operację synchroniczną bez wywoływania funkcji, które mogą wywołać przełączenie planisty (np. wywołania systemowe, operacje wejścia/wyjścia lub wywołanie runtime.Gosched()).

Jest to związane z tym, że Go używa kooperatywnego wielozadaniowości na poziomie gorutyn: przełączanie następuje w określonych punktach, takich jak wywołania operacji blokujących lub runtime.Gosched(). Jeśli gorutyna wykonuje nieskończoną pętlę bez takich punktów, może «zablokować» planistę, nie ustępując kontroli innym gorutynom.

Przykład:

for {
    // jeśli tutaj nie ma wywołań, które mogą ustąpić planistowi,
    // gorutyna może nie ustąpić innym
}

Dlatego zaleca się wstawianie wywołań runtime.Gosched() lub używanie kanałów/operacji blokujących, aby umożliwić planistowi przełączanie gorutyn.