Infinite-Loop Goroutine Blocks Go HTTP Server
Die Go-Laufzeit, die für die Verwaltung der gleichzeitigen Ausführung verantwortlich ist, ist stolz auf nicht blockierende Vorgänge. Ein Szenario mit einer Endlosschleifen-Goroutine, die von einem HTTP-Server aus initiiert wird, gibt jedoch Anlass zur Sorge. Obwohl genügend Threads und Goroutinen vorhanden sind (laut runtime.GOMAXPROCS), scheint diese Endlosschleife die Verarbeitung anderer Anfragen durch den Server zu blockieren.
Um das Problem zu veranschaulichen, haben Sie Beispielcode mit einem Server mit einer Unendlichkeit bereitgestellt -loop-Goroutine (standardmäßig deaktiviert) und ein Client, der gleichzeitig HTTP-Anfragen sendet. Wenn die Goroutine deaktiviert ist, zeigt der Client die erwarteten Sternchen an. Die Aktivierung führt jedoch nach einer Handvoll Anfragen zu einer Blockade in der Ausgabe des Clients.
Das Rätsel bleibt auch nach dem Experimentieren mit runtime.LockOSThread innerhalb der Goroutine bestehen, da die Blockierung nicht behoben werden kann. Laut Go-Dokumentation sollte runtime.LockOSThread die Endlosschleife in einem separaten Thread ausführen und andere Goroutinen davon unberührt lassen.
Dieses rätselhafte Verhalten könnte dem Go-Laufzeitplaner zugeschrieben werden. Obwohl dies in gewisser Weise präventiv ist, ist es nicht ganz so. Go 1.2 führte Verbesserungen ein, indem gelegentliche Scheduler-Aufrufe während Funktionsaufrufen erzwungen wurden. Den Endlosschleifen in diesem Beispiel fehlen jedoch Funktionsaufrufe, wodurch diese Lösung umgangen wird.
Erwägen Sie, Ihren Endlosschleifen-Handlern sinnvolle Arbeit hinzuzufügen. Alternativ könnte ein bewusster Aufruf von runtime.Gosched das Blockierungsproblem lindern.
Das obige ist der detaillierte Inhalt vonWarum blockiert eine Endlosschleifen-Goroutine einen Go-HTTP-Server trotz ausreichender Ressourcen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!