Junior — Middle
Jak odbywa się zmiana wykonywania między różnymi goroutines w języku Go?
sobes.tech AI
Odpowiedź od AI
W języku Go zmiana wykonywania między gorutynami (goroutines) odbywa się przez planistę Go runtime, który implementuje model M:N — zbiór gorutyn (M), które są planowane na zbiór wątków systemowych (N).
Planista Go działa kooperatywnie i preemptively:
- Gorutyna może dobrowolnie oddać kontrolę, wywołując
runtime.Gosched(), co pozwala innym gorutynom na wykonanie. - Planista może przerwać gorutynę w określonych punktach (np. podczas wywołań blokujących, wywołań systemowych, operacji wejścia/wyjścia).
- Runtime Go automatycznie przełącza kontekst między gorutynami, zapisując ich stan (stos, rejestry).
W ten sposób przełączanie między gorutynami odbywa się wewnątrz runtime Go, a programista zazwyczaj nie kontroluje tego bezpośrednio.
Przykład jawnego oddania kontroli:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // oddajemy wykonanie innym gorutynom
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Goroutine główna -", i)
}
}
Tutaj runtime.Gosched() pozwala na przełączenie na inne gorutyny.