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!