Jak zachowuje się program w języku Go, gdy GOMAXPROCS jest ustawione na 1 i uruchomiona jest gorutyna z nieskończoną pętlą, jeśli jednocześnie próbujemy wykonać inną część kodu?
sobes.tech AI
Odpowiedź od AI
Ustawiając GOMAXPROCS=1 w programie Go, ogranicza się liczbę jednoczesnych wątków systemowych do jednego. Jeśli uruchomisz gorutynę z nieskończoną pętlą bez wywoływania funkcji pozwalających planującemu na zmianę kontekstu (np. time.Sleep, runtime.Gosched), ta gorutyna zajmie jedyny dostępny wątek i zablokuje wykonywanie innych gorutyn.
W rezultacie inna część kodu uruchomiona w innych gorutynach nie będzie mogła działać równolegle i będzie czekać, aż nieskończona pętla odda kontrolę. Wynika to z faktu, że planista gorutyn Go na poziomie użytkownika przełącza wykonywanie między gorutynami, ale przy GOMAXPROCS=1 jest tylko jeden wątek systemu operacyjnego, i jeśli gorutyna nie pozwala planiściowi na zmianę, pozostałe są zablokowane.
Przykład:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// nieskończona pętla bez yield
}
}()
time.Sleep(time.Second) // dajemy czas gorutynie na uruchomienie
fmt.Println("Inna część kodu") // może nigdy się nie wykonać
}
Aby uniknąć blokad, w nieskończonej pętli należy umieścić wywołania pozwalające planiściowi na zmianę kontekstu, np. runtime.Gosched() lub time.Sleep.