Sobes.tech
Junior — Middle

Cum se realizează schimbarea de execuție între diferite goroutines în limbajul Go?

sobes.tech AI

Răspuns de la AI

În limbajul Go, schimbarea execuției între goroutines se realizează de planificatorul runtime-ului Go, care implementează modelul M:N — un set de goroutines (M) programate pe un set de fire de sistem (N).

Planificatorul Go funcționează cooperativ și preemptiv:

  • O goroutine poate ceda explicit controlul apelând runtime.Gosched(), ceea ce permite altor goroutines să ruleze.
  • Planificatorul poate întrerupe o goroutine în anumite puncte (de exemplu, la apeluri blocante, apeluri de sistem, operații de intrare/ieșire).
  • Runtime-ul Go schimbă automat contextul între goroutines, păstrând starea lor (stivă, registre).

Astfel, schimbarea între goroutines are loc în interiorul runtime-ului Go, iar programatorul de obicei nu controlează acest lucru direct.

Exemplu de cedare explicită a controlului:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // cedăm execuția altor goroutines
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine principală -", i)
    }
}

Aici, runtime.Gosched() permite trecerea la alte goroutines.