他のゴルーチンをブロックするゴルーチン
指定されたコード スニペットでは、最初のゴルーチンが無限ループに入り、残りのゴルーチンの送信をブロックします。タイムアウトチャネル。この動作は、ゴルーチンの協調スケジューリングの特徴です。
次のシナリオでは、ゴルーチンはスケジューラに譲ります:
この場合、無限ループ最初のゴルーチンでは、スケジューラに屈服するのを防ぎます。したがって、他のゴルーチンはタイムアウト チャネルに送信できず、プログラムは 1 秒後に終了するのではなく、無期限に実行され続けます。
この問題に対する考えられる解決策の 1 つは、協調スケジューラの代わりにプリエンプティブ スケジューラを使用することです。プリエンプティブ スケジューラでは、システムは優先順位に基づいてゴルーチンを強制的に切り替えます。ただし、Go は現在協調スケジューラを使用しています。
もう 1 つの戦略は、runtime.Gosched() を使用してスケジューラに手動で譲歩することです。ただし、チャネルまたはシステム I/O を介した十分な通信があるため、この手法は通常、ほとんどのプログラムでは必要ありません。
GOMAXPROCS をより高い値に設定しても、問題が完全に解決されない可能性があることに注意することが重要です。複数のゴルーチンを並行して実行できますが、ガベージ コレクターは依然として同期的に動作します。 CPU 使用率の高いゴルーチンが決して譲歩しない場合、GC は実行中に他のゴルーチンを無期限にブロックする可能性があります。
以上がゴルーチンが相互にブロックするのはなぜですか? これにどう対処できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。