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

Pourquoi les opérations de canal chaînées dans l'instruction « select » de Go conduisent-elles à une impasse ?

Mary-Kate Olsen
Libérer: 2024-11-22 05:37:22
original
617 Les gens l'ont consulté

Why Do Chained Channel Operations in Go's `select` Statement Lead to Deadlock?

Opérations de canal chaînées dans un cas sélectionné : comprendre les blocages

Dans Go, la fonction fanIn regroupe les valeurs de plusieurs canaux d'entrée en une seule sortie canal, fournissant une forme de multiplexage. L'instruction select dans la fonction fanIn utilise des opérations <- non bloquantes pour lire simultanément plusieurs canaux d'entrée.

Cependant, si l'instruction select est modifiée pour inclure des opérations de canal enchaînées, telles que :

select {
    case ch <- <-input1:
    case ch <- <-input2:
}
Copier après la connexion

des comportements étranges peuvent survenir. Certaines valeurs peuvent être supprimées, entraînant un blocage.

Pour comprendre pourquoi cela se produit, il est essentiel de se rappeler que dans une instruction select, une seule opération de lecture ou d'écriture sur un canal est non bloquante. D'autres se comportent comme si l'opérateur de bloc était utilisé.

Dans la fonction fanIn modifiée, le premier cas lit une valeur de input1 et tente de l'écrire dans ch de manière non bloquante. Cela peut réussir si la fonction principale consomme la valeur rapidement. Cependant, il y a une petite chance que la boucle de fonction principale ne soit pas assez rapide pour faire cela.

Dans les itérations suivantes de la boucle fanIn, le deuxième cas est susceptible d'être sélectionné, et à ce moment-là, le le deuxième goroutine a peut-être écrit une valeur dans ch. Cependant, si la fonction principale n'a pas encore consommé la valeur de l'itération précédente, elle sera supprimée.

Ce cycle de suppression de valeurs conduit finalement à une situation où il n'y a plus d'écrivains, mais un lecteur est toujours en attente de valeurs, ce qui entraîne un blocage.

Une version modifiée du code démontre plus clairement ce problème : https://play.golang.org/p/lcM5OKx09Dj

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