Problème : les goroutines à boucle infinie bloquent le serveur HTTP
Dans Go, les goroutines à boucle infinie sont censées bloquer d'autres goroutines lorsqu'elles utilisent moins de threads que les cœurs disponibles, même si runtime.GOMAXPROCS est défini en conséquence. Cependant, ce comportement diffère lors de l'utilisation du package net/http.
Q : Pourquoi une goroutine en boucle infinie bloque-t-elle le serveur HTTP après quelques invocations ?
R : Le planificateur du runtime Go n'est pas entièrement préemptif. Dans votre exemple, la boucle infinie ne contient aucun appel de fonction, empêchant le planificateur d'intervenir. Cela entraîne une gestion continue de la boucle par un thread, bloquant d'autres goroutines, y compris le serveur HTTP.
Q : Pourquoi runtime.LockOSThread() ne parvient-il pas à résoudre le problème ?
A: runtime.LockOSThread() est destiné à garantir que la boucle vide s'exécute dans un thread séparé. Cependant, la nature non préemptive du planificateur rend cette approche inefficace dans ce cas.
Résolution :
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!