Golang-HTTP-Server blockiert beim Start Goroutine von Infinite-Loop
Frage:
Warum führt einen Golang-HTTP-Serverblock aus, wenn eine Goroutine mit Endlosschleife gestartet wird, obwohl mehrere Threads und Goroutinen verfügbar sind runtime.GOMAXPROCS(8) wird festgelegt?
Erklärung:
Dieses Problem tritt auf, weil der Planer der Go-Laufzeit nicht vollständig präventiv ist. Derzeit ruft der Scheduler den Scheduler nur gelegentlich bei Funktionsaufrufen auf. Die fraglichen Endlosschleifen verfügen jedoch über keine Funktionsaufrufe, sodass der Scheduler nicht aufgerufen wird.
Runtime.LockOSThread() und mangelnde Vorbeugung:
Die runtime.LockOSThread()-Funktion dient dazu, die Goroutine, in der sie aufgerufen wird, in einem separaten Thread auszuführen, sie von anderen Goroutinen zu isolieren und zu verhindern, dass sie ausgeführt wird Blockieren des Hauptthreads. Allerdings hilft in diesem Fall nicht einmal runtime.LockOSThread(), da der Scheduler nicht präventiv genug ist. Die Endlosschleife blockiert weiterhin andere Goroutinen, da der Scheduler Threads nicht aktiv wechselt.
Lösung:
Um dieses Problem zu beheben, integrieren Sie einige tatsächliche Logik- oder Funktionsaufrufe in die Endlosschleife kann dabei helfen, den Scheduler häufiger auszulösen. Alternativ kann ein expliziter Aufruf von runtime.Gosched() innerhalb der Endlosschleife den Scheduler dazu zwingen, den Thread zu wechseln, sodass andere Goroutinen die Ausführung fortsetzen können.
Das obige ist der detaillierte Inhalt vonWarum blockiert mein Go-HTTP-Server, wenn eine Goroutine eine Endlosschleife ausführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!