Recueillir les résultats des Goroutines dans une tranche
Utiliser des goroutines pour traiter simultanément des données et collecter des résultats peut s'avérer difficile, en particulier lors de la gestion de la concurrence et des threads. sécurité. Dans votre code, vous avez rencontré une erreur de blocage car le groupe d'attente a reçu le signal d'attendre la fin de toutes les goroutines avant de collecter les résultats.
Pour résoudre ce problème, nous devons fermer de manière asynchrone le canal des résultats une fois que toutes les goroutines sont terminées. leurs tâches. Voici une version modifiée de votre code :
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 { // Process results }
Ce changement garantit que le canal des résultats est fermé lorsque toutes les goroutines sont terminées, ce qui nous permet de collecter correctement les résultats.
De plus, pour une amélioration clarté du code et testabilité, il est recommandé de refactoriser newSample pour qu'il soit une fonction synchrone qui génère des résultats plutôt que de prendre le groupe d'attente et le canal. Cela permet une séparation plus claire des problèmes de concurrence et des tests plus faciles.
En mettant en œuvre ces ajustements, vous pouvez collecter efficacement les résultats de vos goroutines et éviter les erreurs de blocage.
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!