首頁 > 後端開發 > Golang > 為什麼我的 Go Goroutine 逾時通道沒有觸發?

為什麼我的 Go Goroutine 逾時通道沒有觸發?

Linda Hamilton
發布: 2024-12-11 07:10:10
原創
205 人瀏覽過

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

Goroutine 超時通道從未被調用

在 Go 中使用 goroutine 和通道時,了解超時的工作原理至關重要。在此程式碼片段中,目標是如果通道 c1 上沒有收到任何值,則在 2 秒後列印「TIMEOUT」。但是,超時情況永遠不會執行。

說明:

問題在於 select 循環內建立超時通道的方式。每次從 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
登入後複製

現在,c1 不活動活動2 秒後, “TIMEOUT”已正確列印。

以上是為什麼我的 Go Goroutine 逾時通道沒有觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板