两种方式中哪一种是惯用方式? time.Sleep()或股票代码?

时间:2018-11-15 09:01:16

标签: go

我必须每分钟执行一些语句。我不确定应该遵循以下哪一项。如果有人可以在内存和CPU方面说明利弊,那就太好了。

time.Sleep()

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

}

2 个答案:

答案 0 :(得分:5)

从文档中

  

NewTicker返回一个新的Ticker,其中包含一个通道,该通道将发送时间,该时间由duration参数指定。它会调整间隔或滴答滴答声以弥补接收速度慢的问题。持续时间d必须大于零;如果没有,NewTicker将惊慌。停止行情自动收录器以释放关联的资源。

time.Sleep仅等待提供的时间,然后继续执行程序。如果其余代码需要更长的时间,则无法进行调整。

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

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

在第一个版本中,程序将执行代码十秒钟,然后进入休眠状态60秒钟。几乎每70秒就会调用一次。

在第二个版本中,代码将执行10秒钟,然后置顶器将等待时间调整为50秒钟。您的代码每分钟都会准确执行一次。

答案 1 :(得分:0)

在上面的示例中没有区别。但是,行情收录器还使用通道,因此并发安全。例如,您可以创建几个应该每2秒执行一次工作的工作人员,而不是使用股票交易系统,那么您需要1个工作人员同时完成这项工作。