"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment éviter les blocages lors du déplacement sur un canal tamponné dans GoLang ?

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

Publié le 2024-11-02
Parcourir:367

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 que toutes les goroutines sont terminées :

ch := make(chan []int, 5)
...
wg.Wait()
close(ch)

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 :

func main() {
    ch := make(chan []int, 4)
    ...
    go func() {
        for c := range ch {
            fmt.Printf("c is %v\n", c)
            wg.Done()
        }
    }()
    ...
}

Cette approche garantit que la fonction Done() n'est appelée qu'après que chaque élément a été imprimé, signalant ainsi l'achèvement de chaque goroutine.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3