Goroutine Infinite Loop bloquant le serveur HTTP dans Go
Le langage de programmation Go permet la création de goroutines simultanées qui s'exécutent en parallèle. Cependant, une observation récente a soulevé des inquiétudes quant au comportement des goroutines en boucle infinie dans les serveurs HTTP.
Selon la documentation Go, définir runtime.GOMAXPROCS(8) avec 8 cœurs de processeur devrait permettre aux goroutines de s'exécuter en parallèle. sans se bloquer. Cependant, ce n'est pas le cas lors de l'utilisation du package net/http. Une goroutine en boucle infinie semble bloquer le serveur après quelques requêtes.
Le problème ne se limite pas au code, car il persiste même lorsque runtime.LockOSThread() est ajouté à la goroutine en boucle infinie. Ceci est inattendu car runtime.LockOSThread() devrait garantir que la boucle s'exécute dans un thread séparé, libérant ainsi d'autres goroutines pour continuer à s'exécuter.
Explication
Le runtime Go le planificateur n’est pas entièrement préemptif. En l'absence d'appels de fonction, comme dans le cas du code en boucle infinie, le planificateur n'est pas déclenché. Cela permet à la goroutine en boucle infinie de monopoliser le processeur et d'empêcher d'autres goroutines de s'exécuter.
Solutions
Il existe quelques solutions possibles à ce problème :
Il est important de noter que runtime.LockOSThread() n'isole pas complètement la boucle dans un thread séparé. Il permet à la boucle de s'exécuter sur n'importe quel thread, mais le planificateur peut toujours l'interrompre si d'autres goroutines nécessitent une 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!