超時情況未在GoroutineChannel 中執行
在一個包含Goroutine 和Channel 的程式碼片段中,使用者遇到了一個令人困惑的情況,其中超時情況在select 語句仍未執行。
提供的程式碼建立了兩個goroutine,一個每 1.5 秒向通道發送一次值,另一個監聽值或在 2 秒後觸發逾時。但是,超時情況從未發生。
為什麼會出現這種行為?
關鍵在於在 select 迴圈的每次迭代中重複建立逾時通道。每次從 c1 通道接收到一個值時,time.After() 都會產生一個新通道。這個新通道將在另外 2 秒後收到一個值,但先前的超時通道將變得過時。因此,超時情況永遠無法執行。
要修正此問題並確保逾時如預期發生,請在 select 循環之前僅建立一次逾時通道。透過這樣做,通道在程式執行過程中保持活動狀態,並且 c1 通道上不活動 2 秒後將觸發逾時情況。
以上是為什麼使用通道時我的 Goroutine 逾時案例不執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!