Goroutine blockiert andere Goroutinen
Im angegebenen Codeausschnitt tritt die erste Goroutine in eine Endlosschleife ein und blockiert das Senden der verbleibenden Goroutine an die Timeout-Kanal. Dieses Verhalten ist ein Merkmal der kooperativen Planung in Goroutinen.
Goroutinen weichen dem Planer in den folgenden Szenarien aus:
In diesem Fall verhindert die Endlosschleife in der ersten Goroutine, dass sie nachgibt der Planer. Daher kann die andere Goroutine nicht an den Timeout-Kanal senden und das Programm läuft auf unbestimmte Zeit weiter, anstatt nach einer Sekunde zu beenden.
Eine mögliche Lösung für dieses Problem besteht darin, einen präventiven Scheduler anstelle eines kooperativen Schedulers zu verwenden. In einem präventiven Scheduler wechselt das System zwangsweise zwischen Goroutinen basierend auf ihren Prioritäten. Derzeit verwendet Go jedoch einen kooperativen Scheduler.
Eine andere Strategie besteht darin, mithilfe von runtime.Gosched() manuell dem Scheduler nachzugeben. Allerdings ist diese Technik in den meisten Programmen aufgrund der ausreichenden Kommunikation über Kanäle oder System-E/A im Allgemeinen nicht erforderlich.
Es ist wichtig zu beachten, dass das Setzen von GOMAXPROCS auf einen höheren Wert das Problem möglicherweise nicht vollständig löst. Während der Garbage Collector die parallele Ausführung mehrerer Goroutinen ermöglicht, arbeitet er dennoch synchron. Wenn die Goroutinen mit hoher CPU-Leistung niemals nachgeben, kann der GC andere Goroutinen während der Ausführung auf unbestimmte Zeit blockieren.
Das obige ist der detaillierte Inhalt vonWarum blockieren sich Goroutinen gegenseitig und wie lässt sich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!