Warum eine Endlosschleifen-Goroutine einen Go-HTTP-Server blockiert
Obwohl die Anzahl der maximal verfügbaren Threads auf 8 gesetzt ist, startet ein Endlos- Die Schleifengoroutine führt dazu, dass der HTTP-Server nach einigen Aufrufen blockiert. Dieses Verhalten widerspricht der Annahme, dass unabhängige Threads das Blockieren verhindern würden.
Erklärung:
Der Scheduler der Go-Laufzeit arbeitet nicht vollständig präventiv. Während der Scheduler während Funktionsaufrufen regelmäßig aufgerufen wird, verhindert eine Endlosschleife ohne diese Aufrufe, dass der Scheduler ausgelöst wird. Dieses nicht präventive Verhalten führt dazu, dass die Endlosschleifen-Goroutine alle verfügbaren Threads verbraucht und keine für den HTTP-Server übrig bleibt.
runtime.LockOSThread()
Laufzeit hinzufügen. LockOSThread() für die Endlosschleife hätte die Ausführung auf einem einzelnen Thread erzwingen und ihn so vom HTTP-Server isolieren sollen. Das Problem kann dadurch jedoch nicht behoben werden.
Laut der Go-Dokumentation für runtime.LockOSThread() sollte die angestrebte leere Schleife in einem separaten Thread ausgeführt werden, sodass andere Goroutinen gleichzeitig ausgeführt werden können. Es scheint jedoch, dass die leere Schleife im Beispiel nicht ausreichend ausgelastet ist, um die Thread-Trennung auszulösen.
Lösung:
Um dieses Problem zu beheben, können Sie Folgendes verwenden: eine Schleife mit einer tatsächlichen Ausführungslogik oder rufen Sie runtime.Gosched() innerhalb der Schleife manuell auf. Dadurch wird der Scheduler ausgelöst und andere Goroutinen, einschließlich des HTTP-Servers, können die Ausführung fortsetzen.
Das obige ist der detaillierte Inhalt vonWarum blockiert eine Endlosschleifen-Goroutine einen Go-HTTP-Server trotz Thread-Limits?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!