【问题标题】:Use sleep inside ticker在自动收报机内使用睡眠
【发布时间】:2023-04-04 02:48:01
【问题描述】:
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 时,代码停止正常工作,我希望该代码每 10 秒启动一次,但我看到的结果如屏幕截图所示。我怎样才能正确地做到这一点? enter image description here

【问题讨论】:

    标签: go time sleep ticker


    【解决方案1】:

    替换

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

    ticker := time.NewTicker(period)
    

    看看这是否有效。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2016-03-01
        相关资源
        最近更新 更多