gpt4 book ai didi

Golang 超时不与 channel 一起执行

转载 作者:IT王子 更新时间:2023-10-29 01:39:20 27 4
gpt4 key购买 nike

我正在使用 goroutines/channels。这是我的代码。为什么超时情况没有得到执行?

func main() {
c1 := make(chan int, 1)

go func() {
for {
time.Sleep(1500 * time.Millisecond)
c1 <- 10
}
}()

go func() {
for {
select {
case i := <-c1:
fmt.Println(i)
case <-time.After(2000 * time.Millisecond):
fmt.Println("TIMEOUT") // <-- Not Executed
}
}
}()

fmt.Scanln()
}

最佳答案

您的超时不会发生,因为您的一个 goroutine 每隔 1.5 秒(左右)重复在您的 c1 channel 上发送一个值,并且您的超时只会在没有值的情况下发生从 c1 接收 2 秒。

一旦从 c1 接收到值,在下一次迭代中再次执行 select new time.After() 调用将返回一个 channel ,该 channel 上的值只会在另外 2 秒后发送。先前 select 执行的超时 channel 被丢弃,不再使用。

要在 2 秒后接收超时,只需创建一次超时 channel ,例如:

timeout := time.After(2000 * time.Millisecond)
for {
select {
case i := <-c1:
fmt.Println(i)
case <-timeout:
fmt.Println("TIMEOUT") // Will get executed after 2 sec
}
}

输出:

10
TIMEOUT
10
10
10
...

关于Golang 超时不与 channel 一起执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com