Golang sync.WaitGroup wird nie abgeschlossen
Der bereitgestellte Code demonstriert Parallelität, indem er eine Liste von URLs abruft und Dateien bedingt herunterlädt und in der Datei speichert System. Die Haupt-Goroutine wartet darauf, dass alle Dateien mithilfe einer sync.WaitGroup abgerufen werden. Das Programm wird jedoch auch nach Abschluss aller Anforderungen nicht beendet.
Um das Problem zu verstehen, betrachten Sie die Funktionalität der WaitGroup. Es zählt die ausgeführten Goroutinen. Wenn die Anzahl jemals Null erreicht, kehrt die Wartegruppe sofort zurück und zeigt an, dass alle Goroutinen die Ausführung abgeschlossen haben.
Im angegebenen Code wird die Add-Methode der WaitGroup verwendet, um die Anzahl zu erhöhen, während die Done-Methode verwendet wird, um sie zu verringern . Wenn die Add-Methode öfter aufgerufen wird als die Done-Methode oder umgekehrt, erreicht die WaitGroup nie Null, was dazu führt, dass die Haupt-Goroutine auf unbestimmte Zeit wartet.
Der bereitgestellte Code enthält zwei Fehler:
func main() { ... go downloadFromURL(url, &wg) ... }
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
Mit diesen Korrekturen funktioniert die WaitGroup ordnungsgemäß und verringert ihre Anzahl, wenn Goroutinen ihre Funktion abschließen Aufgaben, die letztendlich zum erfolgreichen Beenden der Haupt-Goroutine führen.
Das obige ist der detaillierte Inhalt vonWarum wird My Go sync.WaitGroup nie abgeschlossen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!