首页 >后端开发 >Golang >为什么我的 Go Goroutine 超时通道没有触发?

为什么我的 Go Goroutine 超时通道没有触发?

Linda Hamilton
Linda Hamilton原创
2024-12-11 07:10:10205浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn