In Go ist die Verwaltung der Parallelität mit sync.WaitGroup und Kanälen eine gängige Praxis. Für Anfänger kann es jedoch rätselhaft sein, wenn ein Programm ins Stocken gerät, obwohl es die Erwartungen an die Fertigstellung der Goroutine erfüllt. Lassen Sie uns einen konkreten Fall untersuchen und das zugrunde liegende Problem lösen.
Ein Entwickler hat ein Programm implementiert, das sync.WaitGroup und einen Kanal (fetchedSymbols) verwendet, um gleichzeitig eine Liste von Aktienkursen abzurufen. Während das Programm auf den Abschluss der Goroutinen wartete, weigerte es sich zu beenden.
Die Wurzel des Problems liegt darin, dass der fetchedSymbols-Kanal nicht geschlossen wurde. Beim Durchlaufen dieses Kanals in der Hauptfunktion wird das Programm auf unbestimmte Zeit blockiert. In diesem Fall sollte das Schließen des Kanals nach Abschluss aller Goroutinen eingeleitet werden.
Um eine reibungslose Programmausführung zu gewährleisten, hat der Entwickler eine Hilfs-Goroutine eingeführt, die die sync.WaitGroup und die Trigger überwacht das Schließen von fetchedSymbols, sobald alle Goroutinen ihre Aufgaben abgeschlossen haben. Dadurch wurde das Blockierungsverhalten beseitigt und das Programm konnte ordnungsgemäß beendet werden.
<code class="go">go func() { wg.Wait() close(fetchedSymbols) }() for response := range fetchedSymbols { fmt.Println("fetched " + response) }</code>
Durch die Implementierung dieser Lösung wird das Programm nun ordnungsgemäß beendet, nachdem alle Börsenkurse erfolgreich heruntergeladen wurden, wodurch die Parallelität von Go effizient genutzt wird Funktionen.
Das obige ist der detaillierte Inhalt vonWarum bleibt mein Go-Programm stehen, obwohl alle Goroutinen abgeschlossen sind? Eine Anleitung zu sync.WaitGroup und Kanalblockierung.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!