Ar įmanoma situacija, kai planuotojas ne verčia goroutine'ą pasiduoti vykdymui?
sobes.tech AI
Atsakymas iš AI
Go kalba, goroutine planuotojas (scheduler) paprastai pats valdo perėjimą tarp goroutine'ų, kad užtikrintų konkurencingą vykdymą. Tačiau gali atsitikti, kad goroutine nepaleidžia valdymo, jei ji vykdo ilgalaikę sinchroninę operaciją be funkcijų, kurios galėtų sukelti planuotojo perėjimą (pavyzdžiui, sisteminius iškvietimus, įvesties/išvesties operacijas ar runtime.Gosched() iškvietimą).
Tai susiję su tuo, kad Go naudoja kooperatyvinį daugiaprocesiškumą goroutine lygyje: perėjimas vyksta tam tikrose vietose, pavyzdžiui, blokuojančių operacijų ar runtime.Gosched() iškvietimų metu. Jei goroutine vykdo begalinį ciklą be tokių taškų, ji gali «užblokuoti» planuotoją, neperduodama kontrolės kitoms goroutine'oms.
Pavyzdys:
for {
// jei čia nėra iškvietimų, galinčių perduoti planuotojui,
// goroutine gali neperduoti vykdymo kitiems
}
Todėl rekomenduojama įterpti iškvietimus runtime.Gosched() arba naudoti kanalus/blokuojančias operacijas, kad leistumėte planuotojui keisti tarp goroutine'ų.