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!