Cas d'expiration non exécuté dans GoroutineChannels
Dans un extrait de code comportant des goroutines et des canaux, un utilisateur rencontre une situation déroutante où le cas d'expiration dans une instruction select reste inexécutée.
Le code fourni établit deux goroutines, l'un envoie des valeurs à un canal toutes les 1,5 secondes et un autre écoute les valeurs ou déclenche un délai d'attente après 2 secondes. Cependant, le cas de timeout ne se produit jamais.
Pourquoi ce comportement est-il observé ?
La clé réside dans la création répétée du canal de timeout à chaque itération de la boucle de sélection. Chaque fois qu'une valeur est reçue du canal c1, un nouveau canal est généré par time.After(). Ce nouveau canal recevra une valeur après 2 secondes supplémentaires, mais le canal de timeout précédent deviendra obsolète. Par conséquent, le cas d'expiration ne peut jamais être exécuté.
Pour résoudre ce problème et garantir que le délai d'attente se produit comme prévu, créez le canal de délai d'attente une seule fois avant la boucle de sélection. Ce faisant, le canal reste actif tout au long de l'exécution du programme, et le cas de timeout se déclenchera après 2 secondes d'inactivité sur le canal c1.
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!