Lehetséges-e, hogy a tervező nem kényszeríti a goroutine-t a végrehajtás átadására?
sobes.tech MI
Válasz az MI-től
Go-ban a goroutine ütemező (scheduler) általában maga kezeli a goroutine-ok közötti váltást a konkrrens végrehajtás biztosítása érdekében. Azonban előfordulhat olyan helyzet, amikor egy goroutine nem adja át a végrehajtást, ha hosszú szinkron műveletet hajt végre anélkül, hogy olyan funkciókat hívna meg, amelyek kiválthatják az ütemező váltását (például rendszerhívások, bemenet/kimenet műveletek vagy a runtime.Gosched() hívása).
Ez azért van, mert a Go kooperatív multitaskingot használ goroutine szinten: a váltás meghatározott pontokon történik, például blokkoló műveletek vagy runtime.Gosched() hívásakor. Ha egy goroutine végtelen ciklust futtat ilyen pontok nélkül, akkor «blokkolhatja» az ütemezőt, és nem adja át a kontrollt más goroutine-oknak.
Példa:
for {
// ha itt nincsenek olyan hívások, amik átadhatják az ütemezőnek,
// a goroutine nem adhatja át a végrehajtást másoknak
}
Ezért ajánlott a runtime.Gosched() hívások beszúrása vagy csatornák/blokkoló műveletek használata, hogy lehetővé tegyük az ütemező számára a goroutine-ok közötti váltást.