Hängt nach Einstellung von GOMAXPROCS(2)
Sie haben das Programm so konfiguriert, dass zwei gleichzeitige Threads mithilfe von runtime.GOMAXPROCS(2) zulässig sind. Das Programm bleibt jedoch bei der Ausgabe von Zahlen hängen, obwohl die CPU-Auslastung hoch ist.
Das Problem entsteht durch das Vorhandensein einer Busy-Schleife in der Funktion „forever()“. Eine Besetztschleife läuft kontinuierlich, ohne dass die Kontrolle an den Planer abgegeben wird. In diesem Fall verbraucht die Funktion „forever()“ effektiv einen der verfügbaren Threads auf unbestimmte Zeit.
Dieses Verhalten beeinträchtigt die Fähigkeit des Planers, den verbleibenden Thread der Funktion „show()“ zuzuweisen, weshalb das Programm dies scheinbar tut aufhängen. Die Funktion show() führt außerdem zu einer Ineffizienz, da sie zwischen den Iterationen 1000 Millisekunden lang schläft.
Lösung
Um dieses Problem zu beheben, sollten Sie die Besetztschleife aus der ewigen Schleife entfernen ()-Funktion und implementieren Sie einen Planungspunkt innerhalb der show()-Funktion. Ein Planungspunkt ermöglicht es dem Scheduler, die Kontrolle regelmäßig zurückzugewinnen und sicherzustellen, dass alle Goroutinen die Möglichkeit haben, ausgeführt zu werden.
Hier ist der geänderte Code:
func forever() { for { runtime.Gosched() } } func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) runtime.Gosched() fmt.Println(number) } }
Durch Hinzufügen von runtime.Gosched() at Am Ende der for-Schleife in der Funktion show() können Sie das Problem beheben und dafür sorgen, dass das Programm reibungslos läuft.
Das obige ist der detaillierte Inhalt vonWarum hängt mein Go-Programm trotz Einstellung von GOMAXPROCS(2) und hoher CPU-Auslastung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!