Pourquoi un Goroutine à boucle infinie bloque un serveur HTTP Go
Malgré la définition du nombre maximum de threads disponibles à 8, le démarrage d'un serveur infini- loop goroutine provoque le blocage du serveur HTTP après quelques invocations. Ce comportement contredit l'hypothèse selon laquelle des threads indépendants empêcheraient le blocage.
Explication :
Le planificateur du runtime Go fonctionne de manière non entièrement préemptive. Bien qu'il invoque périodiquement le planificateur lors des appels de fonction, une boucle infinie sans ces appels empêche le déclenchement du planificateur. Ce comportement non préemptif amène la goroutine à boucle infinie à consommer tous les threads disponibles, n'en laissant aucun pour le serveur HTTP.
runtime.LockOSThread()
Ajout du runtime. LockOSThread() à la boucle infinie aurait dû forcer son exécution sur un seul thread, l'isolant du serveur HTTP. Cependant, il ne parvient pas à résoudre le problème.
Selon la documentation Go pour runtime.LockOSThread(), la boucle vide ciblée doit s'exécuter dans un thread séparé, permettant à d'autres goroutines de s'exécuter simultanément. Cependant, il semble que la boucle vide dans l'exemple ne soit pas suffisamment occupée pour déclencher la séparation des threads.
Solution :
Pour résoudre ce problème, vous pouvez soit utiliser une boucle avec une logique d'exécution réelle ou appelez manuellement runtime.Gosched() dans la boucle. Cela déclenchera le planificateur et permettra aux autres goroutines, y compris le serveur HTTP, 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!