Go-Parallelität mit for-Schleife und anonymer Funktionsanregung
Bei dem Bestreben, das Parallelitätsverständnis mithilfe von Gos sync.WaitGroup zu verbessern, stieß ein Entwickler auf eine unerwartetes Verhalten mit Code, der mehrere Uploads auf Amazon S3 ermöglichen soll. Die ersten Codeausschnitte werden angezeigt:
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() }
Zur Überraschung des Entwicklers zeigte die Ausgabe durchweg „6, 6, 6, 6, 6“ an, abweichend von der erwarteten Reihenfolge, z. B. „2, 4, 1“. , 5, 3.“ Als die Schleife bis 5 iteriert, erschien das unerwartete Ergebnis 6. Nachfolgende Änderungen, die i als Argument in die anonyme Funktion einbezog, führten zur beabsichtigten Ausgabe.
Enthüllung der Begründung
Die Dokumentation für Abschlüsse in Go beleuchtet dieses Verhalten. Während die for-Schleife fortschreitet, erfassten die Abschlüsse den Wert von i zum Zeitpunkt ihrer Definition. Daher werden die Goroutinen mit einem gemeinsamen Wert von 6 ausgeführt, obwohl die Schleife endet, nachdem i 5 erreicht hat, und geben letztendlich „6, 6, 6, 6, 6“ aus.
Durch die Übergabe von i als Argument wird a Die neue Variable erfasst den Wert von i zum Zeitpunkt ihrer Deklaration, was zur gewünschten Ausgabe führt.
Das obige ist der detaillierte Inhalt vonWarum gibt mein Go-Parallelitätsbeispiel fünfmal „6' anstelle eindeutiger Zahlen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!