GoroutineChannels でタイムアウト ケースが実行されない
ゴルーチンとチャネルを特徴とするコード スニペットで、ユーザーはタイムアウト ケースが次の不可解な状況に遭遇します。 select ステートメントは実行されないままになります。
提供されたコードは 2 つのステートメントを確立します。 1 つは 1.5 秒ごとにチャネルに値を送信し、もう 1 つは値をリッスンするか、2 秒後にタイムアウトをトリガーします。ただし、タイムアウトのケースは決して発生しません。
なぜこの動作が観察されるのですか?
重要なのは、選択ループの各反復でタイムアウト チャネルが繰り返し作成されることにあります。 c1 チャネルから値を受信するたびに、time.After() によって新しいチャネルが生成されます。この新しいチャネルはさらに 2 秒後に値を受け取りますが、以前のタイムアウト チャネルは廃止されます。したがって、タイムアウト ケースは実行できません。
この問題を修正し、タイムアウトが期待どおりに発生するようにするには、選択ループの前にタイムアウト チャネルを 1 回だけ作成します。そうすることで、プログラムの実行中チャネルはアクティブなままとなり、c1 チャネルで 2 秒間の非アクティブ状態が続いた後にタイムアウト ケースがトリガーされます。
以上がチャネルの使用時に Goroutine タイムアウト ケースが実行されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。