Maison > développement back-end > Golang > Pourquoi mon serveur HTTP Go se bloque-t-il lorsqu'un Goroutine exécute une boucle infinie ?

Pourquoi mon serveur HTTP Go se bloque-t-il lorsqu'un Goroutine exécute une boucle infinie ?

DDD
Libérer: 2024-12-05 14:44:09
original
179 Les gens l'ont consulté

Why Does My Go HTTP Server Block When a Goroutine Runs an Infinite Loop?

Le serveur HTTP Golang bloque au démarrage de Goroutine d'Infinite-Loop

Question :

Pourquoi fait un blocage du serveur HTTP Golang lorsqu'une goroutine de boucle infinie est démarrée, malgré la présence de plusieurs threads et goroutines disponibles en raison à runtime.GOMAXPROCS(8) en cours de définition ?

Explication :

Ce problème se produit car le planificateur du runtime Go n'est pas entièrement préemptif. Actuellement, le planificateur n'appelle qu'occasionnellement le planificateur lors des appels de fonction. Cependant, les boucles infinies en question n'ont aucun appel de fonction, le planificateur n'est donc pas invoqué.

Runtime.LockOSThread() et manque de pré-emption :

La fonction runtime.LockOSThread() est conçue pour exécuter la goroutine dans laquelle elle est invoquée sur un thread séparé, l'isolant des autres goroutines et empêchant il bloque le thread principal. Cependant, dans ce cas, même runtime.LockOSThread() n'est pas utile car le planificateur n'est pas suffisamment préventif. La boucle infinie continue de bloquer les autres goroutines, car le planificateur ne change pas activement de thread.

Solution :

Pour résoudre ce problème, incorporant des appels de logique ou de fonction réels dans la boucle infinie peut aider à déclencher le planificateur plus fréquemment. Alternativement, appeler explicitement runtime.Gosched() dans la boucle infinie peut forcer le planificateur à changer de thread, permettant ainsi à d'autres goroutines de reprendre l'exécution.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal