首頁 >後端開發 >Golang >為什麼使用通道時我的 Goroutine 逾時案例不執行?

為什麼使用通道時我的 Goroutine 逾時案例不執行?

Linda Hamilton
Linda Hamilton原創
2024-12-19 10:03:08745瀏覽

Why Doesn't My Goroutine Timeout Case Execute When Using Channels?

超時情況未在GoroutineChannel 中執行

在一個包含Goroutine 和Channel 的程式碼片段中,使用者遇到了一個令人困惑的情況,其中超時情況在select 語句仍未執行。

提供的程式碼建立了兩個goroutine,一個每 1.5 秒向通道發送一次值,另一個監聽值或在 2 秒後觸發逾時。但是,超時情況從未發生。

為什麼會出現這種行為?

關鍵在於在 select 迴圈的每次迭代中重複建立逾時通道。每次從 c1 通道接收到一個值時,time.After() 都會產生一個新通道。這個新通道將在另外 2 秒後收到一個值,但先前的超時通道將變得過時。因此,超時情況永遠無法執行。

要修正此問題並確保逾時如預期發生,請在 select 循環之前僅建立一次逾時通道。透過這樣做,通道在程式執行過程中保持活動狀態,並且 c1 通道上不活動 2 秒後將觸發逾時情況。

以上是為什麼使用通道時我的 Goroutine 逾時案例不執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn