猿问

我有一个奇怪的错误

给出了以下两个功能。


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 分钟的间隔。


有人知道为什么会这样吗?




慕勒3428872
浏览 97回答 1
1回答

SMILET

我建议使用 atime.Ticker每 N 秒执行一次操作。这样,您就可以使用内置计时器,并且仅在需要做某事时才唤醒 CPU。即使 CPU 使用率不高,time.Sleepfor 循环也不是最可靠的任务调度方式。例如(来自上面的链接):package mainimport (    "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)        }    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答