Sobes.tech
Junior — Middle

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.