Sobes.tech
Junior — Middle

Възможно ли е ситуация, в която планировчикът не принуждава горутината да се откаже от изпълнението?

sobes.tech AI

Отговор от AI

В Go планировчикът на горутините (scheduler) обикновено сам управлява превключването между горутините, за да осигури конкурентно изпълнение. Въпреки това, може да възникне ситуация, в която горутината не предава управлението, ако изпълнява дълга синхронна операция без да извиква функции, които могат да предизвикат превключване на планировчика (например системни извиквания, операции за вход/изход или извикване на runtime.Gosched()).

Това се дължи на факта, че Go използва кооперативна многозадачност на ниво горутина: превключването се случва в определени точки, като извиквания на блокиращи операции или runtime.Gosched(). Ако горутината изпълнява безкраен цикъл без такива точки, тя може да «блокира» планировчика, без да предава управлението на други горутини.

Пример:

for {
    // ако тук няма извиквания, които могат да предадат управлението,
    // горутината може да не предава изпълнението на други
}

Затова се препоръчва да се вмъкват извиквания към runtime.Gosched() или да се използват канали/блокиращи операции, за да се позволи на планировчика да превключва между горутините.