Unerwartetes Verhalten der Go-Parallelität mit for-Schleifen und anonymen Funktionen
Bei der Go-Parallelität ist es wichtig, das Verhalten anonymer Funktionen beim Start zu verstehen als Goroutinen. Dies wurde gezeigt, als versucht wurde, sync.WaitGroup zu verwenden, um darauf zu warten, dass mehrere Goroutinen den Amazon S3-Upload abschließen.
Der ursprüngliche Code verwendete eine for-Schleife zum Starten von Goroutinen, aber die Ausgabe zeigte überraschenderweise, dass alle Goroutinen denselben Wert druckten ( 6). Dies geschah, weil die Goroutinen erst nach Abschluss der for-Schleife geplant wurden, sodass der Wert von i bei ihrer Ausführung 6 war.
Der Code wurde geändert, um i als Argument an die anonyme Funktion zu übergeben, was zu … das gewünschte Verhalten. Dies liegt daran, dass durch die Übergabe von i eine neue Variable erstellt und der Wert zum Zeitpunkt des Aufrufs erfasst wird.
Dieses Verhalten steht im Einklang mit der Go-FAQ, die besagt, dass eine anonyme Funktion, wenn sie als Goroutine gestartet wird, den Status erfasst seiner umgebenden Variablen zum Zeitpunkt der Erstellung. Durch die Übergabe von i als Argument wird der Wert in diesem Moment effektiv kopiert.
Daher ist es bei der Verwendung anonymer Funktionen in Goroutinen wichtig, das Abschlussverhalten zu berücksichtigen und Techniken wie die Wertübergabe zu verwenden, um das gewünschte Parallelitätsverhalten zu erreichen.
Das obige ist der detaillierte Inhalt vonWarum geben Go-Goroutinen, die in einer For-Schleife mit anonymen Funktionen gestartet werden, alle denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!