Ihr Ziel ist es, Goroutinen in Go zu nutzen, um Elemente parallel zu verarbeiten und ihre Ergebnisse zu sammeln in eine Scheibe schneiden. Sie sind jedoch auf einen verblüffenden Deadlock-Fehler gestoßen: „Alle Goroutinen schlafen – Deadlock!“
Der Fehler ist auf zwei Probleme in Ihrem Code zurückzuführen:
Um diese Probleme zu beheben, führen Sie eine Goroutine ein, die den Kanal asynchron schließt, wenn die Arbeiter fertig sind:
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { .. }
Wenn Sie Wenn Sie für eine optimale Effizienz eine feste Anzahl von Workern benötigen, refaktorisieren Sie den Code wie folgt:
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
Dies hält die Parallelitätsprimitive zusammen und vereinfacht das Refactoring für verschiedene Parallelitätsmuster.
Das obige ist der detaillierte Inhalt vonWie vermeidet man Deadlocks bei der Verwendung von Goroutinen für die parallele Verarbeitung und Ergebniserfassung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!