Sobes.tech
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.