go - 重复不同持续时间的倒计时

标签 go timer ticker

我想制作一个具有 2 个不同持续时间的倒计时代码。做这个的最好方式是什么?我尝试这样做:

s5 := time.Tick(5 * time.Second)
m5 := time.Tick(5 * time.Minute)

for {
    select {
        case t := <-s5:
            ...
        case t := <-m5:
            ...
    }
}

但我需要不同时间间隔的代码:

5:00 -> 0:00
0:05 -> 0:00
5:00 -> 0:00
0:05 -> 0:00

执行此操作的惯用方法是什么?

最佳答案

如果你愿意,你可以直接调用 sleep

dur := 1 * time.Second
nextDur := 3 * time.Second

for {
    time.Sleep(dur)
    dur, nextDur = nextDur, dur

    ...
}

如果您需要选择,或者在time.Timer 中替换持续时间。这是我个人坚持的做法,因为您不必担心由于调度不一致而导致两个定时器之间的偏差偏移。

dur := 1 * time.Second
nextDur := 3 * time.Second

timer := time.NewTimer(dur)

for {
    select {
    case t := <-timer.C:
        dur, nextDur = nextDur, dur
        timer.Reset(dur)
        ...
    }
    ...
}

或者运行 2 个以较小的间隔偏移的计时器

dur1 := 1 * time.Second
dur2 := 3 * time.Second

timer1 := time.NewTimer(dur1)
timer2 := time.NewTimer(dur1 + dur2)

for {
    select {
    case t := <-timer1.C:
        timer1.Reset(dur1 + dur2)
        fmt.Println("timer1:", t)
    case t := <-timer2.C:
        timer2.Reset(dur1 + dur2)
        fmt.Println("timer2:", t)
    }

}

你也可以像你最初尝试的那样运行交错的代码,但这需要更多的协调来延迟其中一个代码的启动

dur1 := 1 * time.Second
dur2 := 3 * time.Second

ticker1 := time.NewTicker(dur1)
ticker2 := time.NewTicker(dur1 + dur2)

var once sync.Once
delayOnce := func() {
    ticker1.Stop()
    ticker1 = time.NewTicker(dur1 + dur2)
}

for  {
    select {
    case t := <-ticker1.C:
        once.Do(delayOnce)
        fmt.Println("ticker1:", t)
    case t := <-ticker2.C:
        fmt.Println("ticker2:", t)
    }

}

关于go - 重复不同持续时间的倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065928/

相关文章:

go - 返回 Golang 中 strings.Split() slice 的最后一项

go - 试图了解 Go gob 编码器的工作原理

go - 如何获得时间。滴答立即滴答

Golang——避免未知类型的重复代码

java - 新任务的不同计时器对象?

cron - Golang : Implementing a cron/executing tasks at a specific time

c# - 在毛伊岛构建节拍器,但声音播放器不规则并且对计时器不响应。间隔

java - 系统时钟的外部更改如何影响 java util 计时器?

javascript - jQuery 光滑 slider : How to make a logo ticker slider