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

随着时间超时。After 的行为不像用自动收报机或计时器超时

随着时间超时。After 的行为不像用自动收报机或计时器超时

Go
ITMISS 2021-11-08 16:14:48
我希望以下功能的行为方式相同func fillChanTimeoutUsingTicker(maxDuration time.Duration, chanSize int) chan string {    c := make(chan string, chanSize)    ticker := time.NewTicker(maxDuration)    for {        select {        case <-ticker.C:            ticker.Stop()            fmt.Println("Ticker:operation timedout")            return c        case c <- "Random message":        default:            fmt.Println("Ticker:chan is full")            return c        }    }}func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string {    c := make(chan string, chanSize)    for {        select {        case <-time.After(maxDuration):            fmt.Println("time.After:operation timedout")            return c        case c <- "Random message":        default:            fmt.Println("time.After:chan is full")            return c        }    }}称他们为:    resWithTicker := fillChanTimeoutUsingTicker(time.Duration(1*time.Microsecond), 10000000)    fmt.Println(len(resWithTicker))    resWithTimeAfter := fillChanTimeoutUsingTimeAfter(time.Duration(1*time.Microsecond), 10000000)    fmt.Println(len(resWithTimeAfter))印刷:Ticker:operation timedout43979time.After:chan is full10000000我认为他们会以完全相同的方式行事,我真的没有得到巨大的差异,对此有什么想法吗?请注意,还可以像在股票代码功能中一样使用计时器按预期工作。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

问题出在您的代码中。


在您的第一个示例中,您正在创建一个股票代码并将其用于超时。

在您的第二个示例中,您每次循环时都会创建一个计时器:


case <-time.After(maxDuration):

从库源中可以看出,这相当于


case <- time.NewTimer(maxDuration).C:

如果每次循环时都创建一个新的 Ticker/Timer(并丢弃旧的),它可能永远不会触发。


因此,为了让您的第二个示例正确运行,请这样做(未经测试):


func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string {

    c := make(chan string, chanSize)

    t := time.After(maxDuration)

    for {

        select {

        case <-t:

            fmt.Println("time.After:operation timedout")

            return c

        case c <- "Random message":

        default:

            fmt.Println("time.After:chan is full")

            return c

        }

    }

}


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

添加回答

举报

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