Junior — Middle
Jak se provádí změna provádění mezi různými gorutinami v jazyce Go?
sobes.tech AI
Odpověď od AI
V jazyce Go je přepínání mezi gorutinami prováděno plánovačem runtime Go, který implementuje model M:N — množinu gorutin (M), které jsou plánovány na množinu systémových vláken (N).
Plánovač Go funguje kooperativně a předběžně:
- Gorutina může explicitně předat řízení voláním
runtime.Gosched(), což umožňuje jiným gorutinám běžet. - Plánovač může přerušit gorutinu v určitých bodech (například při volání blokujících operací, systémových volání, operacích vstupu/výstupu).
- Runtime Go automaticky přepíná kontext mezi gorutinami a ukládá jejich stav (zásobník, registry).
Tímto způsobem přepínání mezi gorutinami probíhá uvnitř runtime Go, a programátor to obvykle přímo neřídí.
Příklad explicitního předání řízení:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // předává řízení jiným gorutinám
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Hlavní goroutine -", i)
}
}
Zde runtime.Gosched() umožňuje přepnout na jiné gorutiny.