問題: 無限ループのゴルーチンが HTTP サーバーをブロックする
Go では、使用するスレッドが少ない場合、無限ループのゴルーチンが他のゴルーチンをブロックすることが期待されますruntime.GOMAXPROCS がそれに応じて設定されている場合でも、利用可能なコアよりも多くなります。ただし、net/http パッケージを利用する場合、この動作は異なります。
Q: 無限ループの goroutine が数回呼び出した後で HTTP サーバーをブロックするのはなぜですか?
A: Go ランタイムのスケジューラは完全にはプリエンプティブではありません。この例では、無限ループに関数呼び出しが含まれていないため、スケジューラの介入が妨げられています。これにより、1 つのスレッドによるループの継続的な処理が発生し、HTTP サーバーを含む他のゴルーチンがブロックされます。
Q: runtime.LockOSThread() が問題の解決に失敗するのはなぜですか?
A: runtime.LockOSThread() は、空のループが別のループで実行されるようにすることを目的としています。 糸。ただし、スケジューラの非プリエンプティブな性質により、この場合、このアプローチは無効になります。
解決策:
以上が無限ループのゴルーチンが Go HTTP サーバーをブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。