给出了以下两个功能。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 分钟的间隔。有人知道为什么会这样吗?
1 回答
SMILET
TA贡献1796条经验 获得超4个赞
我建议使用 atime.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)
}
}
}
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报
0/150
提交
取消