Sobes.tech
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.