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) }
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!