过早触发定时器

时间:2017-05-31 16:08:56

标签: go timer

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

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

...别处

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

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

timer.Reset(time.Millisecond)

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用取消频道:

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

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

cancel <- struct{}{}