有以下两个功能。
func main() {
index := int(0)
for {
Loop(index)
index = (index + 1) % 86400 // Max interval: 1 day
time.Sleep(1 * time.Second)
}
}
func Loop(index int) {
if index%10 == 0 {
go doSomething...
}
}
我想每10/60/3600秒执行一次操作。因此,我认为以模为底的递增索引应该可以做到这一点。
但是我注意到(尤其是在高流量服务器上),它似乎跳过了某些循环。
我查看了我的日志,有时每隔10秒就会有一些记录,但有时甚至会有1分钟的间隔。
有人知道为什么会这样吗?
答案 0 :(得分:3)
我建议使用time.Ticker
每N秒执行一些操作。这样,您就可以使用内置计时器,并且仅在需要完成某些操作时才唤醒CPU。即使CPU使用率不高,time.Sleep
和for循环也不是调度任务的最可靠方法。例如(从上面的链接):
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
time.Sleep(10 * time.Second)
done <- true
}()
for {
select {
case <-done:
fmt.Println("Done!")
return
case t := <-ticker.C:
fmt.Println("Current time: ", t)
}
}
}