首页 > 解决方案 > 两者中哪一个是惯用的方式?time.Sleep() 还是ticker?

问题描述

我必须每分钟执行一些语句。我不确定我应该遵循以下哪一项。如果有人能解释一下内存和 CPU 的优缺点,那就太好了。

时间.睡眠()

func main() {

go func() {
    for {
        time.Sleep(time.Minute)
        fmt.Println("Hi")
    }
}()

time.Sleep(10 * time.Minute) //just to keep main thread running

}

或股票代码

func main() {

go func() {
     for _ = range time.Tick(time.Minute) {
      fmt.Println("Hi")
     }

}()

time.Sleep(10 * time.Minute) //just to keep main thread running

}

标签: go

解决方案


从文档:

NewTicker 返回一个新的 Ticker,其中包含一个通道,该通道将以持续时间参数指定的周期发送时间。它调整间隔或丢弃滴答声以弥补慢速接收器。持续时间 d 必须大于零;如果没有,NewTicker 会恐慌。停止代码以释放相关资源。

time.Sleep只需等待提供的时间并继续程序。如果其余代码需要更长的时间,则无需调整。

代码将所提供块的执行时间考虑在内,并在必要时跳过一个间隔。

想象一下这种情况:您提供一分钟的时间间隔,而您的代码需要 10 秒才能执行。

在您的第一个版本中,您的程序执行您的代码 10 秒,然后休眠 60 秒。实际上,它每 70 秒调用一次。

在您的第二个版本中,您的代码将执行 10 秒,然后自动收报机将等待时间调整为 50 秒。您的代码每分钟准确执行一次。


推荐阅读