Heim  >  Artikel  >  Backend-Entwicklung  >  **Warum läuft mein Golang-Programm, das WaitGroup und Channels verwendet, auf unbestimmte Zeit?**

**Warum läuft mein Golang-Programm, das WaitGroup und Channels verwendet, auf unbestimmte Zeit?**

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-26 09:46:29767Durchsuche

**Why Does My Golang Program Using WaitGroup and Channels Run Indefinitely?**

WaitGroup- und Kanalnutzung im Golang-Programm

Dieses Golang-Programm nutzt sync.WaitGroup und Kanäle, um eine effiziente Goroutine-Ausführung und Datenerfassung zu erreichen. Es tritt jedoch ein Problem auf, bei dem das Programm nach Abschluss seiner Aufgaben nicht beendet wird. Dieser Artikel geht auf das Problem ein und bietet eine Lösung.

Das Programm umfasst das Abrufen von Börsenkursen für eine Liste von Symbolen und das anschließende Speichern der Ergebnisse in Dateien. Es verwendet eine Kombination aus Goroutinen und Kanälen, um den Abrufvorgang gleichzeitig auszuführen, mit einer WaitGroup, um den Abschluss aller Aufgaben zu verfolgen. Das Programm gerät jedoch in eine Endlosschleife, da der fetchedSymbols-Kanal auf unbestimmte Zeit geöffnet bleibt.

Um dieses Problem zu beheben, muss das Programm den fetchedSymbols-Kanal schließen, nachdem alle Goroutinen ihre Aufgaben abgeschlossen haben. Zu diesem Zweck kann die WaitGroup genutzt werden, die bereits den Abschluss der Goroutine verfolgt. Durch das Hinzufügen eines go func()-Wrappers, der den Kanal schließt, wenn die WaitGroup Null erreicht, wird das Problem behoben.

Der geänderte Codeabschnitt lautet wie folgt:

<code class="go">...
go func() {
    wg.Wait()
    close(fetchedSymbols)
}()

for response := range fetchedSymbols {
    fmt.Println("fetched " + response)
}

...</code>

Der hinzugefügte go Die Funktion func() wartet darauf, dass die WaitGroup Null erreicht, was anzeigt, dass alle Goroutinen ihre Aufgaben abgeschlossen haben. Anschließend wird der fetchedSymbols-Kanal geschlossen, sodass die Bereichsschleife in main wie erwartet beendet werden kann und das Programm die Ausführung abschließen kann.

Dieses verbesserte Programm nutzt WaitGroup und Kanäle effektiv für die gleichzeitige Goroutine-Ausführung und den Datenabruf und wird beendet würdevoll nach Abschluss aller notwendigen Aufgaben.

Das obige ist der detaillierte Inhalt von**Warum läuft mein Golang-Programm, das WaitGroup und Channels verwendet, auf unbestimmte Zeit?**. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn