"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment éviter les blocages dans Go Concurrency avec sync.WaitGroup ?

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

Publié le 2024-11-02
Parcourir:591

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 proposons une solution efficace.

L'erreur se produit en raison d'une 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, s'exécute indéfiniment, essayant 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 :

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)
    }
}

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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3