Junior — Middle
Kako se vrši promena izvršavanja između različitih gorutina u jeziku Go?
sobes.tech АИ
Одговор од АИ
U jeziku Go, promena izvršavanja između gorutina vrši se od strane planera Go runtime-a, koji implementira model M:N — skup gorutina (M) koji se planira na skup sistemskih niti (N).
Planer Go radi kooperativno i preemptivno:
- Gorutina može eksplicitno da preda kontrolu pozivom
runtime.Gosched(), što omogućava drugim gorutinama da se izvršavaju. - Planer može prekinuti gorutinu u određenim tačkama (npr. pri pozivima blokirajućih operacija, sistemskih pozivima, operacijama ulaza/izlaza).
- Runtime Go automatski menja kontekst između gorutina, čuvajući njihovo stanje (stog, registre).
Na ovaj način, prebacivanje između gorutina dešava se unutar runtime-a Go, i programer obično ne kontroliše to direktno.
Primer eksplicitnog prepuštanja kontrole:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // prepuštamo izvršenje drugim gorutinama
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Glavna gorutina -", i)
}
}
Ovde, runtime.Gosched() omogućava prebacivanje na druge gorutine.