Maison > développement back-end > Golang > Pourquoi ce programme Go imprime-t-il « ping » puis « bonjour » malgré les écritures simultanées sur les canaux ?

Pourquoi ce programme Go imprime-t-il « ping » puis « bonjour » malgré les écritures simultanées sur les canaux ?

Barbara Streisand
Libérer: 2024-12-16 05:16:14
original
742 Les gens l'ont consulté

Why Does This Go Program Print

Comprendre l'ordre de sortie des canaux dans Golang

Considérez le programme Golang suivant :

func main() {
  messages := make(chan string)
  go func() { messages <- "hello" }()
  go func() { messages <- "ping" }()
  msg := <-messages
  msg2 := <-messages
  fmt.Println(msg)
  fmt.Println(msg2)
}
Copier après la connexion

Ce programme implique deux goroutines écrire de manière asynchrone sur un canal et la routine principale lire à partir du même canal. Malgré la nature sans tampon du canal, la sortie affiche systématiquement « ping » puis « bonjour ».

Pour comprendre le raisonnement derrière cette sortie, il est crucial de comprendre que l'ordre de sortie du canal n'est pas basé sur l'ordre dans lesquels les goroutines sont créées. Au lieu de cela, il est déterminé par le planificateur, qui décide de l'ordre d'exécution des goroutines de manière non déterministe.

Lorsque le programme s'exécute, les deux goroutines responsables de l'envoi des messages au canal s'exécutent simultanément. Étant donné que le canal n'est pas tamponné, les deux goroutines se bloquent jusqu'à ce qu'un récepteur soit disponible.

Lorsque la routine principale tente de lire sur le canal à l'aide de msg := <-messages, le planificateur accorde l'accès à l'une des goroutines en attente. . Cette goroutine envoie avec succès un message au canal, qui est ensuite reçu par la routine principale et affecté à msg.

Par la suite, lorsque la routine principale essaie à nouveau de lire depuis le canal en utilisant msg2 := <-messages , le planificateur sélectionne la goroutine restante et lui permet d'envoyer son message au canal. Le message est ensuite récupéré par la routine principale et affecté à msg2.

Dans ce cas particulier, le planificateur sélectionne systématiquement la goroutine envoyant "ping" comme la première à envoyer son message. Cependant, il est important de noter que ce résultat n'est pas déterministe et peut changer en fonction de facteurs tels que la charge du système et l'environnement d'exécution.

Pour résumer, l'ordre de sortie dans les canaux Golang n'est pas garanti et est soumis aux ordre d'exécution du planificateur pour les goroutines. Par conséquent, malgré la simplicité de cet exemple, le résultat peut varier selon les différentes exécutions.

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