Comportement inattendu de la concurrence Go avec les boucles for et les fonctions anonymes
Dans la concurrence Go, il est essentiel de comprendre le comportement des fonctions anonymes au lancement comme des goroutines. Cela a été démontré lors de la tentative d'utilisation de sync.WaitGroup pour attendre que plusieurs goroutines terminent les téléchargements Amazon S3.
Le code initial utilisait une boucle for pour lancer les goroutines, mais le résultat montrait étonnamment que toutes les goroutines imprimaient la même valeur ( 6). Cela s'est produit parce que les goroutines n'étaient planifiées qu'après la fin de la boucle for, donc la valeur de i était 6 lors de leur exécution.
Le code a été modifié pour passer i comme argument à la fonction anonyme, ce qui a donné le comportement souhaité. En effet, passer i crée une nouvelle variable et capture la valeur au moment de l'invocation.
Ce comportement est conforme à la FAQ Go, qui indique que lorsqu'une fonction anonyme est lancée en tant que goroutine, elle capture l'état de ses variables environnantes au moment de la création. Passer i comme argument copie efficacement la valeur à ce moment-là.
Par conséquent, lorsque vous utilisez des fonctions anonymes dans des goroutines, il est important de prendre en compte le comportement de fermeture et d'utiliser des techniques telles que le passage de valeur pour obtenir le comportement de concurrence 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!