Heim >Backend-Entwicklung >Golang >Warum wird meine Go WaitGroup beim gleichzeitigen Herunterladen von Dateien nicht abgeschlossen?

Warum wird meine Go WaitGroup beim gleichzeitigen Herunterladen von Dateien nicht abgeschlossen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-28 07:35:12682Durchsuche

Why Doesn't My Go WaitGroup Complete When Downloading Files Concurrently?

WaitGroup wird in Go-Parallelität nicht abgeschlossen

Der bereitgestellte Code versucht, mehrere Dateien gleichzeitig aus einer Liste von URLs herunterzuladen und zu speichern. Die Haupt-Goroutine wird jedoch nie beendet, da die sync.WaitGroup nie abgeschlossen wird.

Zwei Probleme identifiziert:

  1. Synchronisierungsprobleme:
    In downloadFromURL() sollte der Aufruf wg.Done() als eine der ersten Anweisungen aufgerufen werden, nicht am Ende der Funktion. Dadurch wird sichergestellt, dass die WaitGroup korrekt dekrementiert wird, auch wenn die Funktion vorzeitig zurückkehrt.
  2. Parallelitätszeiger:
    Die Funktion downloadFromURL() sollte einen Zeiger auf die sync.WaitGroup erhalten, um die Freigabe zu manipulieren Objekt richtig platzieren. Andernfalls wird durch die Übergabe der WaitGroup als Wert eine Kopie erstellt und an der Kopie vorgenommene Änderungen werden nicht in der Haupt-Goroutine widergespiegelt.

Optimierter Code:

func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()  // Moved to the beginning of the function

    ... // Other code
}

func main() {
    ...

    for _, url := range links {
        if isExcelDocument(url) {
            wg.Add(1)
            go downloadFromURL(url, &wg)  // Pass pointer to WaitGroup
        } else {
            fmt.Printf("Skipping: %v \n", url)
        }
    }
    ...
}

Durch die Behebung dieser Probleme kann die WaitGroup die Anzahl der ausgeführten Goroutinen genau verfolgen und die Haupt-Goroutine wird beendet, sobald alle Downloads abgeschlossen sind.

Das obige ist der detaillierte Inhalt vonWarum wird meine Go WaitGroup beim gleichzeitigen Herunterladen von Dateien nicht abgeschlossen?. 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