go - 两者中哪一个是惯用的方式?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
}
解决方案
从文档:
NewTicker 返回一个新的 Ticker,其中包含一个通道,该通道将以持续时间参数指定的周期发送时间。它调整间隔或丢弃滴答声以弥补慢速接收器。持续时间 d 必须大于零;如果没有,NewTicker 会恐慌。停止代码以释放相关资源。
time.Sleep
只需等待提供的时间并继续程序。如果其余代码需要更长的时间,则无需调整。
代码将所提供块的执行时间考虑在内,并在必要时跳过一个间隔。
想象一下这种情况:您提供一分钟的时间间隔,而您的代码需要 10 秒才能执行。
在您的第一个版本中,您的程序执行您的代码 10 秒,然后休眠 60 秒。实际上,它每 70 秒调用一次。
在您的第二个版本中,您的代码将执行 10 秒,然后自动收报机将等待时间调整为 50 秒。您的代码每分钟准确执行一次。