ホームページ > バックエンド開発 > Golang > チャネルの使用時に Golang タイムアウト ケースがトリガーされないのはなぜですか?

チャネルの使用時に Golang タイムアウト ケースがトリガーされないのはなぜですか?

Patricia Arquette
リリース: 2024-12-18 11:38:15
オリジナル
816 人が閲覧しました

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

チャネルを使用した Golang でタイムアウト ケースがトリガーされない

提供されたコードでは、タイムアウト ケースは select ステートメントと time.After() 呼び出しを使用して実装されています。ただし、タイムアウトのケースは実行されません。

説明

この理由は、time.After() 関数が呼び出されるたびに新しいチャネルを作成するためです。 select ステートメントが (最初の for ループで) c1 チャネルから値を受け取ると、既存の time.After() チャネルは破棄されます。したがって、タイムアウトの場合は値を受け取る機会がありません。

解決策

この問題を解決するには、for ループの外で time.After() チャネルを 1 回だけ作成します。これにより、実行全体を通じて同じチャネルがタイムアウト ケースに使用されることが保証されます。

変更されたコードは次のとおりです:

func main() {
    c1 := make(chan int, 1)

    go func() {
        for {
            time.Sleep(1500 * time.Millisecond)
            c1 <- 10
        }
    }()

    timeout := time.After(2000 * time.Millisecond)
    for {
        select {
        case i := <-c1:
            fmt.Println(i)
        case <-timeout:
            fmt.Println("TIMEOUT")
        }
    }

    fmt.Scanln()
}
ログイン後にコピー

この変更により、タイムアウト ケースは 2 秒後に正常に実行されます。その時間枠内に c1 チャネルから値が受信されない限り。

以上がチャネルの使用時に Golang タイムアウト ケースがトリガーされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート