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中文网其他相关文章!