選択ブロック実行を使用したゴルーチン
Go 同時実行パターンを使用する場合、ゴルーチンを使用して非同期タスクを実行できます。ただし、場合によっては、これらのゴルーチンが無限ループに入り、プログラムの進行が妨げられることがあります。
ケース スタディ: クロール関数
Go Tour 演習 #71 では、クロール関数は、Goroutine と select ステートメントを利用して、一連の URL をクロールします。ただし、select ステートメントにデフォルト句が含まれている場合、Goroutine はブロックされ、実行が停止します。
Select について
select ステートメントは、select ステートメントの基本的な構成要素です。同時実行性の管理に取り組んでください。これにより、Goroutine が複数のチャネルでデータまたはイベントを待機できるようになります。デフォルト句がない場合、select はメッセージがいずれかのチャネルに到着するまで無期限にブロックします。
Default 句の影響
select にデフォルト句を追加すると、その動作が変わります。 。どのチャネルにも利用可能なデータがない場合は、ブロックする代わりに、デフォルト ステートメントがただちに実行されます。クロール関数では、この動作により無限ループが作成されます。
解決策
無限ループを防ぐには、select ステートメントからデフォルト句を削除します。あるいは、チャネル上で利用可能なデータを定期的にチェックする非ブロッキング select ステートメントを実装することもできます。
スケジューラの動作
ゴルーチンは協調的にスケジュールされます。つまり、ゴルーチンは自発的に実行する必要があります。制御をスケジューラに譲り、他のゴルーチンの実行を許可します。この場合、select ステートメントの無限ループにより、スケジューラーが他のゴルーチンを呼び出すことができなくなり、明らかなブロック動作が発生します。
追加の観測
以上がGo の「select」ステートメントの Default 句がクロール関数での Goroutine の実行をブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。