GOMAXPROCS auf 2 gesetzt, aber das Programm bleibt beeinträchtigt
Trotz der Einstellung runtime.GOMAXPROCS(2) stößt ein Programm bei der Ausgabe von Zahlen auf Unterbrechungsprobleme . Obwohl eine hohe CPU-Auslastung beobachtet wird, bleibt die Ursache für die Fehlfunktion unklar.
Der bereitgestellte Code enthält zwei Goroutinen: „forever()“, eine Busy-Schleife, und „show()“, das Zahlen in einer Endlosschleife ausgibt. Die Hauptfunktion stellt GOMAXPROCS so ein, dass zwei CPU-Kerne verwendet werden. Das Programm reagiert jedoch nicht mehr.
Das Problem liegt im kontinuierlichen Betrieb von Forever(). Durch die ständige Ausführung verbraucht es einen gesamten Betriebssystem-Thread und stört die Goroutine-Planung der Laufzeit. Insbesondere in Go 1.5 blockiert es die Stop-the-World-Phase der Garbage Collection.
Um dieses Problem zu beheben, kann die Busy-Schleife in Forever() durch eine Funktion ersetzt werden, die die CPU regelmäßig zurückgibt. Alternativ könnte es ganz entfernt werden, da eine Endlosschleife nicht erforderlich ist.
Zum Beispiel wird das Problem durch Ändern von „forever()“ wie folgt gelöst:
func forever() { for { runtime.Gosched() } }
Durch die Einführung eines Planungspunkts in Schleife kann die Goroutine die Kontrolle abgeben und die Ausführung anderer Goroutinen zulassen. Dadurch wird sichergestellt, dass alle Goroutinen, einschließlich derjenigen, die für die Kernfunktionalität verantwortlich sind, effizient ausgeführt werden können.
Das obige ist der detaillierte Inhalt vonWarum friert mein Go-Programm ein, obwohl „runtime.GOMAXPROCS(2)' eingestellt ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!