Maison > développement back-end > Golang > Pourquoi mon canal Go Unbuffered imprime-t-il les messages dans un ordre inattendu ?

Pourquoi mon canal Go Unbuffered imprime-t-il les messages dans un ordre inattendu ?

Mary-Kate Olsen
Libérer: 2024-12-09 03:38:11
original
662 Les gens l'ont consulté

Why Does My Go Unbuffered Channel Print Messages in an Unexpected Order?

Comprendre l'ordre de sortie des canaux dans Go

L'extrait de code Go donné implique l'utilisation d'un canal sans tampon pour communiquer entre les goroutines. Alors que le code est censé imprimer « bonjour » puis « ping » en raison d'un comportement de blocage, il affiche systématiquement « ping » suivi de « bonjour ». Cela soulève des questions sur l'ordre dans lequel les messages sont écrits et lus sur le canal.

Comme le code le suggère, les canaux non tamponnés bloquent à la fois l'expéditeur et le destinataire jusqu'à ce que les données soient disponibles. Cela signifie que lorsque les routines go tentent d'écrire sur le canal, elles se bloquent jusqu'à ce que le message soit lu.

Lors de l'exécution, le code crée deux routines go qui tentent d'écrire « hello » et « ping » dans la chaîne. Puisqu'aucun récepteur n'est immédiatement disponible, les deux routines se bloquent.

Lorsque la première opération de lecture (msg := <-messages) se produit, le programme ne sélectionnera pas arbitrairement une goroutine en attente. Au lieu de cela, il sélectionnera celui qui a déjà écrit sur le canal. Cela explique pourquoi « ping » est toujours attribué à msg, car il est toujours écrit avant « bonjour ».

Par conséquent, l'ordre des messages imprimés est déterminé par l'ordre d'exécution des goroutines, qui n'est pas déterministe. En ajoutant des instructions d'impression aux goroutines qui écrivent sur le canal, on peut vérifier que l'ordre d'écriture correspond à l'ordre des messages lus sur le canal.

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