Maison > développement back-end > Golang > le corps du texte

Comment éviter les blocages lors du déplacement sur un canal tamponné dans GoLang ?

Linda Hamilton
Libérer: 2024-10-26 17:51:02
original
131 Les gens l'ont consulté

How to Avoid Deadlock When Ranging Over a Buffered Channel in 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 :

  • La taille du canal est trop petite, ce qui entraîne le blocage des goroutines en attente d'écriture sur le canal complet.
  • La plage de fonctionnement sur le canal reste indéfiniment attendre que les éléments arrivent, alors qu'il ne reste plus de goroutines à écrire.

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!