为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 超时不与通道一起执行

Golang 超时不与通道一起执行

Go
一只甜甜圈 2021-12-07 14:46:16
我正在使用 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

...


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信