Maison >développement back-end >Golang >Comment éviter les blocages lors du déplacement sur un canal tamponné dans GoLang ?
Interblocage dans GoLang : pourquoi la portée sur un canal tamponné ?
Lors de l'utilisation de canaux tamponnés dans GoLang, il est important d'éviter de créer une situation de blocage . Un problème récent a soulevé des inquiétudes concernant un blocage rencontré lors d'une tentative de déplacement sur un canal tamponné une fois que toutes les goroutines étaient terminées.
Le code fourni tente d'utiliser un canal tamponné d'une capacité de 4 et de générer 4 goroutines qui envoient des données. au canal. Cependant, le blocage se produit parce que :
Solution 1 : augmenter la taille du canal et fermer une fois terminé
Pour résoudre l'impasse, la taille du canal peut être augmentée et fermée une fois toutes les goroutines terminées :
<code class="go">ch := make(chan []int, 5) ... wg.Wait() close(ch)</code>
Cependant, cela élimine les avantages du pipeline, car il empêche l'impression jusqu'à ce que toutes les tâches soient terminées.
Solution 2 : Achèvement du signal depuis la routine d'impression
Pour activer le pipeline réel, la fonction Done() peut être appelée dans la routine d'impression :
<code class="go">func main() { ch := make(chan []int, 4) ... go func() { for c := range ch { fmt.Printf("c is %v\n", c) wg.Done() } }() ... }</code>
Cette approche garantit que la fonction Done() n'est appelée qu'après l'impression de chaque élément, signalant ainsi l'achèvement de chaque goroutine.
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!