Sobes.tech
Junior — Middle

Da li je moguće da planer ne primora gorutinu da odustane od izvršavanja?

sobes.tech АИ

Одговор од АИ

U Go, scheduler goroutine (scheduler) obično sam upravlja prebacivanjem između goroutine-ova kako bi obezbedio konkurentno izvršavanje. Međutim, može doći do situacije kada goroutine ne preda izvršenje ako izvršava dugu sinhronu operaciju bez poziva funkcija koje mogu izazvati prebacivanje scheduler-a (npr. sistemski pozivi, operacije ulaza/izlaza ili poziv runtime.Gosched()).

To je povezano s tim što Go koristi kooperativno višezadaćno izvršavanje na nivou goroutine-a: prebacivanje se dešava u određenim tačkama, kao što su pozivi blokirajućih operacija ili runtime.Gosched(). Ako goroutine izvršava beskonačnu petlju bez takvih tačaka, može «zaključati» scheduler, ne prepuštajući kontrolu drugim goroutine-ovima.

Primer:

for {
    // ako ovde nema poziva koji mogu prebaciti na scheduler,
    // goroutine možda neće prepuštati izvršenje drugima
}

Stoga se preporučuje umetanje poziva runtime.Gosched() ili korišćenje kanala/blokirajućih operacija, kako bi se omogućilo scheduler-u da prebacuje između goroutine-ova.