Maison >développement back-end >Golang >Pourquoi les Goroutines se comportent-elles différemment sur Go Playground et sur une machine locale ?

Pourquoi les Goroutines se comportent-elles différemment sur Go Playground et sur une machine locale ?

DDD
DDDoriginal
2024-10-23 14:56:01528parcourir

Why Do Goroutines Behave Differently on Go Playground vs. Local Machine?

Différences entre Go Playground et Go sur votre machine

Lors de la comparaison du comportement des goroutines dans Go on the Go Playground et sur votre machine locale , vous pourriez rencontrer des divergences. Pour clarifier les raisons sous-jacentes, examinons votre exemple spécifique.

Sur Go Playground, avec GOMAXPROCS initialement défini sur 1, le code que vous avez fourni devrait produire une erreur « Le processus a pris trop de temps ». En effet, la goroutine créée dans la fonction other() exécute une boucle infinie, empêchant la goroutine principale de continuer et de recevoir des données du canal terminé.

Cependant, sur votre machine locale, la valeur GOMAXPROCS est probablement définie. à un nombre plus élevé (par exemple, le nombre de cœurs de processeur disponibles). Cela permet à plusieurs goroutines de s'exécuter simultanément. Dans votre cas, le goroutine principal reçoit les données du canal terminé tandis que l'autre goroutine exécute la boucle infinie en parallèle. Une fois les données reçues, la goroutine principale poursuit et termine le programme, quelle que soit l'autre goroutine toujours en cours d'exécution.

Ce comportement non déterministe est inhérent au modèle de mémoire Go. L'ordre d'exécution des goroutines n'est pas garanti, sauf si des mécanismes de synchronisation explicites sont utilisés.

Explication :

Sur le Go Playground, GOMAXPROCS est réglé sur 1. Cela signifie qu'un seul goroutine peut s'exécuter à la fois. Dans votre code, la goroutine principale exécute la fonction main() et crée une deuxième goroutine qui exécute la fonction other(). La goroutine principale attend alors sur le canal terminé, qui est bloqué.

Comme une seule goroutine peut s'exécuter à la fois, le planificateur choisit de continuer à exécuter la fonction other(). Cette fonction envoie une valeur sur le canal terminé, rendant à la fois la goroutine actuelle (other()) et la goroutine principale exécutables. Cependant, le planificateur continue d'exécuter other(), puisque GOMAXPROCS=1.

Other() lance alors une autre goroutine exécutant une boucle sans fin. Le planificateur choisit d'exécuter cette goroutine, qui prend une éternité pour atteindre un état bloqué. Par conséquent, la fonction main() n'est pas poursuivie et le programme s'exécute indéfiniment, provoquant l'erreur « Le processus a pris trop de temps » sur Go Playground.

Localement, GOMAXPROCS est probablement supérieur à 1. Cela permet plusieurs goroutines à exécuter simultanément. Une fois que other() envoie des données au canal terminé, le planificateur peut passer au goroutine principal, qui termine et termine le programme. Même si d'autres goroutines sont toujours en cours d'exécution, le programme se terminera à la fin de la goroutine principale.

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!

Déclaration:
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