Sobes.tech
Junior — Middle

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.