Maison  >  Article  >  développement back-end  >  Comment éviter les blocages dans Go Concurrency avec sync.WaitGroup ?

Comment éviter les blocages dans Go Concurrency avec sync.WaitGroup ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 08:53:02208parcourir

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

Résoudre l'impasse de Goroutines

Dans ce scénario, vous avez rencontré une erreur de blocage dans votre code de concurrence Go. Examinons le problème et apportons une solution efficace.

L'erreur se produit en raison de l'inadéquation entre le comportement de vos producteurs et celui du consommateur. Vos producteurs, implémentés dans la fonction producteur, envoient des valeurs sur le canal ch pour une durée limitée. Cependant, le consommateur, présent dans votre fonction principale, court indéfiniment, tentant sans cesse de recevoir des valeurs de ch.

Pour sortir de cette impasse, vous devez vous assurer que le consommateur respecte l'achèvement des producteurs. Cela signifie que le consommateur doit se terminer automatiquement lorsque les producteurs ont fini d'envoyer des valeurs.

Une approche efficace consiste à utiliser un sync.WaitGroup pour coordonner les producteurs. Le groupe d'attente vous permet de suivre la progression des producteurs et d'attendre qu'ils terminent leurs tâches avant de fermer la chaîne. Voici une version améliorée de votre code :

<code class="go">func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}</code>

Dans ce code mis à jour, le sync.WaitGroup est utilisé pour suivre le nombre de producteurs actifs. Les producteurs appellent wg.Done() pour décrémenter le groupe d'attente lorsqu'ils ont fini d'envoyer des valeurs. La goroutine principale attend que tous les producteurs aient fini d'utiliser wg.Wait(), puis ferme le canal ch.

En utilisant un sync.WaitGroup, vous établissez un mécanisme de coordination qui permet à votre consommateur de respecter l'état d'achèvement. des producteurs, résolvant efficacement l'erreur 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