Maison > développement back-end > Golang > Pourquoi les Goroutines à boucle infinie bloquent-ils le serveur HTTP de Go malgré « runtime.GOMAXPROCS » et « runtime.LockOSThread() » ?

Pourquoi les Goroutines à boucle infinie bloquent-ils le serveur HTTP de Go malgré « runtime.GOMAXPROCS » et « runtime.LockOSThread() » ?

Linda Hamilton
Libérer: 2024-12-07 00:15:16
original
697 Les gens l'ont consulté

Why Do Infinite-Loop Goroutines Block Go's HTTP Server Despite `runtime.GOMAXPROCS` and `runtime.LockOSThread()`?

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 :

  • Ajouter du contenu à la boucle infinie : En ajoutant un corps ou des appels de fonction au boucle infinie, le planificateur sera déclenché plus fréquemment et d'autres goroutines auront une chance de s'exécuter.
  • Appelez régulièrement runtime.Gosched : La fonction runtime.Gosched() peut être utilisée pour manuellement cède le planificateur, permettant à d'autres goroutines de s'exécuter. Cette approche n'est peut-être pas idéale pour les applications sensibles aux performances.

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!

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