Maison >développement back-end >Golang >Pourquoi mon exemple de concurrence Go imprime-t-il « 6 » cinq fois au lieu de nombres uniques ?

Pourquoi mon exemple de concurrence Go imprime-t-il « 6 » cinq fois au lieu de nombres uniques ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 03:07:11482parcourir

Why Does My Go Concurrency Example Print

Go Concurrency avec la boucle for et l'excitation de fonctions anonymes

Dans le but d'améliorer la compréhension de la concurrence à l'aide de sync.WaitGroup de Go, un développeur a rencontré un comportement inattendu avec du code conçu pour faciliter les téléchargements multiples vers Amazon S3. Les extraits de code initiaux sont présentés :

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()
}

À la surprise du développeur, la sortie affichait systématiquement "6, 6, 6, 6, 6", s'écartant de l'ordre prévu tel que "2, 4, 1 , 5, 3." Au fur et à mesure que la boucle parcourt jusqu'à 5, le résultat inattendu de 6 apparaît. Les modifications ultérieures qui ont incorporé i comme argument dans la fonction anonyme ont donné le résultat escompté.

Dévoilement de la justification

La documentation sur les fermetures dans Go met en lumière ce comportement. Au fur et à mesure que la boucle for progresse, les fermetures ont capturé la valeur de i au moment de sa définition. Par conséquent, même si la boucle se termine après que i ait atteint 5, les goroutines s'exécutent avec une valeur partagée de 6, affichant finalement "6, 6, 6, 6, 6".

En passant i comme argument, a la nouvelle variable capture la valeur de i au moment de sa déclaration, ce qui donne le résultat souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn