Heim > Backend-Entwicklung > Golang > Warum druckt mein Go-Parallelitätscode sechsmal 6 statt 1 bis 5?

Warum druckt mein Go-Parallelitätscode sechsmal 6 statt 1 bis 5?

DDD
Freigeben: 2024-12-02 00:39:10
Original
346 Leute haben es durchsucht

Why Does My Go Concurrency Code Print 6 Six Times Instead of 1 Through 5?

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()
}
Nach dem Login kopieren

Ü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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage