Heim > Backend-Entwicklung > Golang > Warum wird My Go sync.WaitGroup nie abgeschlossen?

Warum wird My Go sync.WaitGroup nie abgeschlossen?

Barbara Streisand
Freigeben: 2024-11-27 04:57:14
Original
313 Leute haben es durchsucht

Why Doesn't My Go sync.WaitGroup Ever Complete?

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:

  1. Die downloadFromURL-Funktion empfängt eine Kopie der WaitGroup, keinen Zeiger darauf. Dies führt dazu, dass eine Kopie der internen Daten der WaitGroup weitergegeben wird, sodass alle daran innerhalb der Funktion vorgenommenen Änderungen (z. B. der Aufruf von „Done“) für die Haupt-Goroutine nicht sichtbar sind. Um dieses Problem zu beheben, übergeben Sie stattdessen einen Zeiger an die WaitGroup:
func main() {
    ...
    go downloadFromURL(url, &wg)
    ...
}
Nach dem Login kopieren
  1. Die Anweisung „defer wg.Done()“ wird nicht als erste Anweisung in der Funktion „downloadFromURL“ platziert. Wenn vor dem Aufruf von „Done“ ein Fehler auftritt oder eine andere Logik ausgeführt wird, wird der Dekrementierungsvorgang nicht registriert und der Zähler der WaitGroup erreicht nie Null. Um dies zu beheben, stellen Sie sicher, dass defer wg.Done() die erste Anweisung in der Funktion ist:
func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()
    ...
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage