無限ループのゴルーチンを開始すると Golang HTTP サーバーがブロックされる
質問:
理由無限ループのゴルーチンが存在する場合、Golang HTTP サーバー ブロックを実行します。 runtime.GOMAXPROCS(8) が設定されているため、複数のスレッドとゴルーチンが使用可能であるにも関わらず、開始されました?
説明:
この問題は、Go ランタイムのスケジューラが機能していないために発生します。完全に先制攻撃。現在、スケジューラは関数呼び出し中に時々スケジューラを呼び出すだけです。ただし、問題の無限ループには関数呼び出しがないため、スケジューラは呼び出されません。
Runtime.LockOSThread() および Pre-Emptiveness の欠如:
runtime.LockOSThread() 関数は、呼び出されたゴルーチンを別のスレッドで実行し、分離するように設計されています。他のゴルーチンから保護し、メインスレッドをブロックするのを防ぎます。ただし、この場合、スケジューラが十分にプリエンプティブではないため、 runtime.LockOSthread() すら役に立ちません。スケジューラがスレッドを積極的に切り替えないため、無限ループは他のゴルーチンをブロックし続けます。
解決策:
この問題を解決するには、実際のロジックまたは関数呼び出しをいくつか組み込みます。無限ループに陥ると、スケジューラをより頻繁にトリガーするのに役立ちます。あるいは、無限ループ内で runtime.Gosched() を明示的に呼び出すと、スケジューラーにスレッドを強制的に切り替えて、他の goroutine が実行を再開できるようにすることができます。
以上がGoroutine が無限ループを実行すると、Go HTTP サーバーがブロックされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。