Go-Parallelität: Erkundung des überraschenden Verhaltens einer anonymen Funktion in einer for-Schleife
In dieser Untersuchung beleuchten wir etwas Unerwartetes Verhalten der Go-Parallelität bei Verwendung einer for-Schleife und anonym Funktionen.
Problem:
Stellen Sie sich vor, Sie führen den folgenden Codeausschnitt aus, um die Parallelität mit sync.WaitGroup zu testen:
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
Überraschenderweise wurde die Ausgabe beobachtet war: 6, 6, 6, 6, 6, statt der erwarteten Reihenfolge: 1, 2, 3, 4, 5.
Erklärung:
Um dieses Verhalten zu verstehen, verweisen wir auf die Go-FAQ zum Thema „Was passiert, wenn Schließungen als Goroutinen ausgeführt werden?“. In diesem Szenario wurden die Goroutinen erst nach Abschluss der for-Schleife geplant. Folglich war ich zu diesem Zeitpunkt auf 6 vorgerückt. Als die Goroutinen ausgeführt wurden, gaben sie alle den erfassten Wert von i aus, der 6 war.
Durch die Übergabe von i als Argument an die anonyme Funktion wurde effektiv eine Kopie von erstellt den aktuellen Wert und erfasst den Wert zum Zeitpunkt des Aufrufs. Dies erklärt das erwartete Verhalten, das in der geänderten Version des Codes beobachtet wurde.
Das obige ist der detaillierte Inhalt vonWarum druckt mein Go-Parallelitätscode sechsmal 6 statt 1 bis 5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!