为了账号安全,请及时绑定邮箱和手机立即绑定

我有一个奇怪的错误

我有一个奇怪的错误

Go
慕勒3428872 2023-05-08 15:53:08
给出了以下两个功能。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.Sleepfor 循环也不是最可靠的任务调度方式。例如(来自上面的链接):


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)

        }

    }

}


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信