無限ループのゴルーチンが Go HTTP サーバーをブロックする理由
使用可能な最大スレッド数を 8 に設定しているにもかかわらず、無限ループのゴルーチンが開始されるループゴルーチンにより、数回呼び出した後で HTTP サーバーがブロックされます。この動作は、独立したスレッドがブロックを防止するという想定と矛盾します。
説明:
Go ランタイムのスケジューラーは、完全ではないプリエンプティブな方法で動作します。関数呼び出し中にスケジューラを定期的に呼び出しますが、これらの呼び出しがない無限ループにより、スケジューラがトリガーされなくなります。この非プリエンプティブ動作により、無限ループの goroutine が使用可能なスレッドをすべて消費し、HTTP サーバー用のスレッドは何も残りません。
runtime.LockOSThread()
ランタイムを追加します。無限ループに対する LockOSThread() は、単一スレッドでの実行を強制し、HTTP サーバーから分離する必要がありました。ただし、この問題は解決できません。
runtime.LockOSThread() の Go ドキュメントによると、対象の空のループは別のスレッドで実行され、他の goroutine が同時に実行できるようにする必要があります。ただし、この例の空のループは、スレッド分離をトリガーするほどビジーではないようです。
解決策:
この問題に対処するには、次のいずれかを使用できます。実際の実行ロジックを含むループ、またはループ内で runtime.Gosched() を手動で呼び出します。これによりスケジューラがトリガーされ、HTTP サーバーを含む他のゴルーチンが実行を再開できるようになります。
以上がスレッド制限があるにもかかわらず、無限ループのゴルーチンが Go HTTP サーバーをブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。