Junior — Middle
Hogyan történik a végrehajtás váltása különböző goroutine-ok között a Go nyelvben?
sobes.tech MI
Válasz az MI-től
A Go nyelvben a goroutine-ok közötti végrehajtás váltása a Go runtime ütemezője által történik, amely az M:N modellt valósítja meg — egy halmaz goroutine (M), amelyeket egy halmaz rendszer szálon (N) ütemez.
A Go ütemező kooperatív és preemptív módon működik:
- Egy goroutine kifejezetten átadhatja az irányítást a
runtime.Gosched()hívásával, lehetővé téve más goroutine-ok futását. - Az ütemező bizonyos pontokon megszakíthat egy goroutine-t (például blokkoló műveletek, rendszerhívások, bemenet/kimenet műveletek esetén).
- A Go runtime automatikusan váltogatja a kontextust a goroutine-ok között, megőrizve azok állapotát (verem, regiszterek).
Így a goroutine-ok közötti váltás a Go runtime-en belül történik, és a programozó általában nem irányítja ezt közvetlenül.
Példa az explicit átadásra:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // átadjuk a végrehajtást más goroutine-oknak
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Fő goroutine -", i)
}
}
Itt a runtime.Gosched() lehetővé teszi a váltást más goroutine-okra.