首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sleep ticker

使用sleep ticker
EN

Stack Overflow用户
提问于 2021-03-26 06:41:32
回答 2查看 38关注 0票数 3
代码语言:javascript
复制
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"))
    }

}

当我使用time.Sleep inside ticker时,ticker停止正常工作,我希望该ticker每10秒启动一次,但我在屏幕截图上看到了结果。我怎样才能正确地做这件事呢?enter image description here

EN

回答 2

Stack Overflow用户

发布于 2021-03-26 07:02:36

您的代码正常工作,但您打印的时间不对。

代码语言:javascript
复制
    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()来获取当前时间。

代码语言:javascript
复制
    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需要一个持续时间,因此可以简化。

代码语言:javascript
复制
    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秒睡眠。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2021-03-26 06:55:17

替换

代码语言:javascript
复制
ticker := time.NewTicker(time.Until(time.Now().Truncate(period).Add(period)))

使用

代码语言:javascript
复制
ticker := time.NewTicker(period)

看看这能不能用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66808604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档