Ergebnisse von Goroutinen in einem Slice sammeln
Die Verwendung von Goroutinen zum gleichzeitigen Verarbeiten von Daten und Sammeln von Ergebnissen kann eine Herausforderung sein, insbesondere bei der Verwaltung von Parallelität und Threads Sicherheit. In Ihrem Code ist ein Deadlock-Fehler aufgetreten, weil der Wartegruppe signalisiert wurde, auf den Abschluss aller Goroutinen zu warten, bevor Ergebnisse gesammelt werden.
Um dieses Problem zu beheben, müssen wir den Ergebniskanal asynchron schließen, nachdem alle Goroutinen abgeschlossen sind ihre Aufgaben. Hier ist eine modifizierte Version Ihres Codes:
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 { // Process results }
Diese Änderung stellt sicher, dass der Ergebniskanal geschlossen wird, wenn alle Goroutinen abgeschlossen sind, sodass wir die Ergebnisse korrekt erfassen können.
Zusätzlich zur Verbesserung Um Codeklarheit und Testbarkeit zu gewährleisten, wird empfohlen, newSample so umzugestalten, dass es eine synchrone Funktion ist, die Ergebnisse generiert, anstatt die Wartegruppe und den Kanal zu verwenden. Dies ermöglicht eine sauberere Trennung von Parallelitätsproblemen und einfachere Tests.
Durch die Implementierung dieser Anpassungen können Sie effizient Ergebnisse aus Ihren Goroutinen sammeln und Deadlock-Fehler vermeiden.
Das obige ist der detaillierte Inhalt vonWie vermeide ich Deadlocks beim Sammeln von Ergebnissen aus Goroutinen in einem Slice?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!