我正在使用 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()}
1 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
您的超时不会发生,因为您的一个 goroutinec1每隔 1.5 秒(左右)在您的频道上重复发送一个值,并且只有c1在 2 秒内没有收到任何值时才会发生超时。
一旦从 接收到一个值c1,在下一次迭代中select再次执行一个新的 time.After()调用,它将返回一个新的通道,该通道上的值将仅在 2 秒后发送。上次select执行的超时通道被丢弃,不再使用。
要在 2 秒后接收超时,只需创建一次超时通道,例如:
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
...
- 1 回答
- 0 关注
- 142 浏览
添加回答
举报
0/150
提交
取消