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中文網其他相關文章!