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
Libérer: 2024-12-06 03:07:11
original
480 Les gens l'ont consulté

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()
}
Copier après la connexion

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

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal