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

Go Goroutine タイムアウト チャネルがトリガーされないのはなぜですか?

Linda Hamilton
リリース: 2024-12-11 07:10:10
オリジナル
206 人が閲覧しました

Why Doesn't My Go Goroutine Timeout Channel Ever Trigger?

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 サイトの他の関連記事を参照してください。

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