Junior — Middle
Ako sa vykonáva zmena medzi rôznymi gorutinami v jazyku Go?
sobes.tech AI
Odpoveď od AI
V jazyku Go sa zmena vykonávania medzi gorutinami vykonáva plánovač runtime Go, ktorý implementuje model M:N — množinu gorutín (M), ktoré sú plánované na množinu systémových vlákien (N).
Plánovač Go funguje kooperatívne a preemptívne:
- Gorutina môže explicitne odovzdať kontrolu volaním
runtime.Gosched(), čo umožňuje iným gorutinám vykonávať sa. - Plánovač môže prerušiť gorutinu na určitých bodoch (napríklad pri volaní blokujúcich operácií, systémových volaniach, operáciách vstupu/výstupu).
- Runtime Go automaticky prepína kontext medzi gorutinami a uchováva ich stav (zásobník, registre).
Týmto spôsobom prechody medzi gorutinami prebiehajú vo vnútri runtime Go, a programátor to zvyčajne priamo neovláda.
Príklad explicitného odovzdania kontroly:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // prechádzame na iné gorutiny
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Hlavná gorutina -", i)
}
}
Tu runtime.Gosched() umožňuje prechod na iné gorutiny.