我有一个奇怪的错误

时间:2018-11-12 18:00:09

标签: go

有以下两个功能。

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 个答案:

答案 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)
        }
    }
}