Votre objectif est d'utiliser les goroutines dans Go pour traiter les éléments en parallèle, en collectant leurs résultats en tranche. Cependant, vous avez rencontré une erreur de blocage déroutante : "toutes les goroutines sont endormies - blocage !"
L'erreur provient de deux problèmes dans votre code :
Pour corriger ces problèmes, introduisez une goroutine qui ferme le canal de manière asynchrone lorsque les travailleurs ont terminé :
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { .. }
Si vous Si vous avez besoin d'un nombre fixe de nœuds de calcul pour une efficacité optimale, refactorisez le code comme suit :
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
Cela maintient les primitives de concurrence ensemble et simplifie la refactorisation pour différents modèles de concurrence.
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!