Maison >développement back-end >Golang >Comment pouvez-vous sélectionner simultanément un canal d'envoi mis en mémoire tampon et un canal de réception sans tampon dans Go, et comment gérer les données potentiellement obsolètes dans ce scénario ?
Sélection simultanée sur le canal d'envoi tamponné et de réception non tamponné
Dans Go, les canaux fournissent un mécanisme de communication simultanée entre les goroutines. Cette question explore comment sélectionner simultanément un canal d'envoi tamponné et un canal de réception non tamponné, permettant aux goroutines d'envoyer ou de recevoir des données en fonction de la disponibilité du canal.
Sélection sur un canal d'envoi tamponné
Pour sélectionner un canal d'envoi mis en mémoire tampon, tel que s, où les données peuvent être mises en file d'attente avant d'être reçues, vous pouvez utiliser la syntaxe suivante :
case s <- v: // Send value `v` to channel `s`
Cependant, avec les canaux mis en mémoire tampon, la valeur à l'envoi doit être évalué à l'avance, ce qui peut entraîner l'envoi de données obsolètes en raison de conditions de concurrence.
Sélection sur un canal de réception sans tampon
Sélection sur un canal de réception sans tampon, comme r, où les données ne sont pas mises en file d'attente, est simple :
case r := <-r: // Receive value `r` from channel `r`
Par défaut, la sélection sur un canal de réception bloque jusqu'à ce que les données soient disponibles.
Sélection simultanée
Pour sélectionner simultanément le canal d'envoi tamponné s et le canal de réception non tamponné r, vous pouvez utiliser l'instruction select suivante :
select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // No channels are ready, do something else, e.g. sleep }
Gestion des données obsolètes
Lors de l'évaluation de la valeur à envoyer à l'aide de v := valueToSend() en dehors de l'instruction select, il est possible que le canal s devienne plein ou que le canal r reçoive des données avant que la valeur ne soit envoyée. Pour éviter les données obsolètes, un cas par défaut peut être ajouté à l'instruction select. Ce cas par défaut s'exécutera si aucun des deux canaux n'est prêt et peut être utilisé pour effectuer une courte veille, donnant au canal le temps d'atteindre un état prêt.
Éviter les vérifications directes de la longueur du canal
Il est important de noter que vérifier la longueur ou la capacité d'un canal puis envoyer ou recevoir n'est pas fiable. L'état du canal peut changer entre le moment de la vérification et l'envoi/réception, provoquant un comportement de blocage inattendu.
Conclusion
En utilisant une instruction select avec une casse par défaut, les goroutines peut sélectionner simultanément un canal d'envoi tamponné et un canal de réception non tamponné, optimisant ainsi l'utilisation du canal et l'efficacité des ressources. Cependant, il est crucial de prendre en compte le potentiel de données obsolètes et d'éviter les vérifications directes de la longueur des canaux pour garantir une communication fiable.
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!