【问题标题】:Trigger timer prematurely过早触发定时器
【发布时间】:2017-11-01 13:11:38
【问题描述】:

我有一个循环休眠了一段时间。但是,在我的代码的其他地方,我可能需要提前结束睡眠时间,以便可以更快地执行后续逻辑。

for {
    timer = time.NewTimer(30 * time.Second)
    <-timer.C
    // Do something
}

其他地方……

// Trigger timer
// timer.Trigger() ??

当然,timer.Stop() 会停止计时器,但它会导致程序挂起并且不会下降到// Do something。目前,我正在将计时器重置为非常小的持续时间,以便计时器基本上立即到期。

timer.Reset(time.Millisecond)

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: go timer


    【解决方案1】:

    您可以使用取消渠道:

    cancel := make(chan struct{})
    for {
        timer = time.NewTimer(30 * time.Second)
        select {
        case <- timer.C:
            doSomething()
        case <- cancel:
            doSomething()
        }
    }
    

    当您想忽略计时器并立即执行时,只需在cancel 频道发送消息即可:

    cancel <- struct{}{}
    

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多