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