Junior — Middle
Welche Folgen hat es für die Programmausführung, wenn GOMAXPROCS auf 1 gesetzt wird und eine unendliche Goroutine gestartet wird?
sobes.tech KI
Antwort von AI
Das Setzen von GOMAXPROCS auf 1 beschränkt die Anzahl der Betriebssystem-Threads, die vom Go-Planer verwendet werden können, auf einen Thread. Wenn in diesem Szenario eine unendliche Goroutine gestartet wird:
- Alle Berechnungen werden sequenziell in einem einzigen Thread ausgeführt.
- Wenn die unendliche Goroutine keine Punkte enthält, an denen ein Kontextwechsel stattfindet (z.B. durch blockierende Operationen oder
runtime.Gosched()), können andere Goroutinen keine Ausführungszeit erhalten, was zum "Hängen" des Programms führt. - Das Programm kann letztlich nicht mehr reagieren oder sehr langsam laufen, da der Planer nicht effizient zwischen Goroutinen wechseln kann.
Beispiel:
package main
import (
"runtime"
"time"
"fmt"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// unendliche Schleife ohne Aufruf von runtime.Gosched()
}
}()
time.Sleep(time.Second)
fmt.Println("Programm beendet")
}
In diesem Beispiel kann die Hauptgoroutine keine Ausführungszeit erhalten, wenn die unendliche Goroutine die Kontrolle nicht abgibt, was zum "Hängen" des Programms führt.