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!