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 :
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!