Sobes.tech
Junior — Middle

Kaip vykdomas skirtingų goroutine'ų keitimas Go kalboje?

sobes.tech AI

Atsakymas iš AI

Go kalboje, vykdymo perėjimas tarp gorutinų yra valdomas Go runtime planuotojo, kuris įgyvendina M:N modelį — gorutinų (M), kurios planuojamos ant sisteminių sriegių (N).

Go planuotojas veikia kooperatyviai ir preemptively:

  • Gorutina gali aiškiai perduoti kontrolę iškviesdama runtime.Gosched(), kas leidžia vykdyti kitas gorutinas.
  • Planuotojas gali nutraukti gorutinas tam tikrose vietose (pavyzdžiui, blokuojančiose operacijose, sisteminiuose iškvietimuose, įvesties/išvesties operacijose).
  • Go runtime automatiškai keičia kontekstą tarp gorutinų, išsaugodamas jų būseną (stebėjimo, registrus).

Taip, tarp gorutinų vykdymas vyksta viduje Go runtime, ir programuotojas paprastai tai valdo tiesiogiai.

Pavyzdys aiškiai perduodamos kontrolės:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // perduoda vykdymą kitoms gorutinoms
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Pagrindinė gorutina -", i)
    }
}

Čia runtime.Gosched() leidžia pereiti prie kitų gorutinų.