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ų.