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 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.
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