在 ticker 中使用 sleep

3
package main

import (
    "log"
    "time"
)

func main() {
    per := 10
    period := time.Duration(per) * time.Second
    log.Printf("period : %d sec\n\n", per)

    ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))
    for {
        curTime := <-ticker.C
        log.Printf("started %s", curTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("ended %s\n\n", curTime.Format("2 15:04:05"))
    }

}

当我在ticker内使用time.Sleep时,ticker无法正常工作,我希望ticker每10秒启动一次,但是我看到的结果如屏幕截图所示。我该如何正确地做?进入图片描述
2个回答

2

你的代码是可以运行的,但你打印了错误的时间。

    for {
        curTime := <-ticker.C
        log.Printf("started %s", curTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("ended %s\n\n", curTime.Format("2 15:04:05"))
    }

curTime 是当前时刻,所以这个代码会打印两次相同的时间。相反,您应该使用 time.Now() 来获取当前时间。

    for {
        tickTime := <-ticker.C
        log.Printf("tick %s", tickTime.Format("2 15:04:05"))
        time.Sleep(5 * time.Second)
        log.Printf("after sleep %s\n\n", time.Now().Format("2 15:04:05"))
    }

而且,由于NewTicker需要一个Duration参数,因此它可以被简化。

    per := 10
    period := time.Duration(per) * time.Second

    // Rather than printing the number in `per` and assuming it's
    // seconds, print the duration which can format itself.
    log.Printf("period : %s\n\n", period)

    // NewTicker takes a Duration which we already have.
    ticker := time.NewTicker(period)

这样您就可以在10秒节拍内获得正确的5秒睡眠。

2021/03/25 16:02:49 period : 10 sec

2021/03/25 16:02:59 tick 25 16:02:59
2021/03/25 16:03:04 after sleep 25 16:03:04

2021/03/25 16:03:09 tick 25 16:03:09
2021/03/25 16:03:14 after sleep 25 16:03:14

0

替换

ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))

使用

ticker := time.NewTicker(period)

看看这是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接