Goroutine Timeout Channel Never Invoked
Go で goroutine とチャネルを使用する場合、タイムアウトがどのように機能するかを理解することが不可欠です。このコード スニペットの目標は、チャネル c1 で値が受信されなかった場合に 2 秒後に「TIMEOUT」を出力することです。ただし、タイムアウト ケースは実行されません。
説明:
問題は、選択ループ内でタイムアウト チャネルが作成される方法にあります。 c1 から値を受信するたびに、time.After(...) を使用して新しいタイムアウト チャネルが作成されます。これにより、以前のタイムアウトが事実上キャンセルされ、新しいタイムアウトが開始されます。 c1 が値を受信し続ける限り、タイムアウト チャネルは常にリセットされ、2 秒の有効期限に達することはありません。
解決策:
タイムアウトが確実にトリガーされるようにするには意図したとおり、タイムアウト チャネルの作成を選択ループの外に移動します。一度作成するだけで、c1 から受信した値に関係なく、チャネルは有効期限に達するまでアクティブのままになります。
修正コード:
func main() { c1 := make(chan int, 1) timeout := time.After(2000 * time.Millisecond) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
出力:
10 10 10 ... TIMEOUT
2 秒間の非アクティブ状態が続いた後、 c1、「TIMEOUT」は正しく出力されます。
以上がGo Goroutine タイムアウト チャネルがトリガーされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。