Maison  >  Article  >  développement back-end  >  Comment résoudre les problèmes de blocage dans la programmation simultanée Golang avec les canaux ?

Comment résoudre les problèmes de blocage dans la programmation simultanée Golang avec les canaux ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 09:41:03829parcourir

How to Resolve Deadlock Issues in Golang Concurrent Programming with Channels?

Résoudre l'impasse de Goroutine dans la programmation simultanée

Dans la concurrence Golang, la gestion efficace de nombreux canaux de partage de goroutines est cruciale. Comprendre et résoudre les situations de blocage devient essentiel pour un fonctionnement fluide.

Le problème

Vous avez rencontré une erreur de blocage dans votre code Golang, où les goroutines cessent de progresser et ne donnent aucun résultat . Plus précisément, votre code implique plusieurs producteurs ajoutant des valeurs à un canal pendant une durée limitée, et un consommateur qui récupère en permanence les valeurs du canal, sans aucune condition de résiliation.

Cause de l'impasse

L'impasse se produit parce que le canal n'est pas correctement fermé, indiquant la fin de la production de valeur. Sans canal fermé, la goroutine consommatrice attend indéfiniment plus de valeurs, tandis que les goroutines productrices ont déjà terminé leurs tâches.

Solution efficace

Pour sortir de cette impasse, vous devez suivre ces étapes :

  • Coordonner les producteurs : Utilisez un mécanisme de synchronisation, tel qu'un groupe d'attente, pour coordonner les producteurs.
  • Fermer la chaîne : désignez une goroutine de coordination pour fermer la chaîne une fois que tous les producteurs ont terminé leur travail.
  • Utiliser pour la plage sur la chaîne : implémentez une boucle pour la plage sur la chaîne dans le goroutine du consommateur, lui permettant d'itérer automatiquement sur toutes les valeurs envoyées avant la fermeture du canal.

Implémentation

Voici une version révisée de votre code qui répond aux problème de blocage :

<code class="go">import (
    "fmt"
    "sync"
    "time"
)

func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) {
    defer wg.Done()

    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    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)

    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch {
        fmt.Println(v)
    }
}</code>

En implémentant ces changements, vous éliminez le blocage en coordonnant l'achèvement de la goroutine du producteur, en fermant le canal de manière appropriée et en utilisant for range pour consommer efficacement les valeurs du canal.

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