Maison  >  Article  >  développement back-end  >  Comment éviter les impasses lors de la collecte des résultats des Goroutines dans une tranche ?

Comment éviter les impasses lors de la collecte des résultats des Goroutines dans une tranche ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 05:59:01470parcourir

How to Avoid Deadlock When Gathering Results from Goroutines into a Slice?

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!

Déclaration:
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