ホームページ >バックエンド開発 >Golang >無限ループのゴルーチンが Go HTTP サーバーをブロックするのはなぜですか?

無限ループのゴルーチンが Go HTTP サーバーをブロックするのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 21:07:14384ブラウズ

Why Does an Infinite Loop Goroutine Block a Go HTTP Server?

問題: 無限ループのゴルーチンが HTTP サーバーをブロックする

Go では、使用するスレッドが少ない場合、無限ループのゴルーチンが他のゴルーチンをブロックすることが期待されますruntime.GOMAXPROCS がそれに応じて設定されている場合でも、利用可能なコアよりも多くなります。ただし、net/http パッケージを利用する場合、この動作は異なります。

Q: 無限ループの goroutine が数回呼び出した後で HTTP サーバーをブロックするのはなぜですか?

A: Go ランタイムのスケジューラは完全にはプリエンプティブではありません。この例では、無限ループに関数呼び出しが含まれていないため、スケジューラの介入が妨げられています。これにより、1 つのスレッドによるループの継続的な処理が発生し、HTTP サーバーを含む他のゴルーチンがブロックされます。

Q: runtime.LockOSThread() が問題の解決に失敗するのはなぜですか?

A: runtime.LockOSThread() は、空のループが別のループで実行されるようにすることを目的としています。 糸。ただし、スケジューラの非プリエンプティブな性質により、この場合、このアプローチは無効になります。

解決策:

  • 関数呼び出しをトリガーするために空ではないループ本体を導入します。
  • 無限ループ内で runtime.Gosched を手動で呼び出して、スケジューラが介入できるようにします。プロセッサを明示的に譲ります。

以上が無限ループのゴルーチンが Go HTTP サーバーをブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。