Heim >Backend-Entwicklung >Golang >Warum gibt mein Go-Parallelitätsbeispiel fünfmal „6' anstelle eindeutiger Zahlen aus?

Warum gibt mein Go-Parallelitätsbeispiel fünfmal „6' anstelle eindeutiger Zahlen aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-06 03:07:11482Durchsuche

Why Does My Go Concurrency Example Print

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!

Stellungnahme:
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