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: }
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!