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

在 golang 的特定纪元时间启动 cronjob

在 golang 的特定纪元时间启动 cronjob

Go
阿晨1998 2023-01-03 14:14:11
我正在使用github.com/robfig/cron库。我想以毫秒为单位在 epoc 时间运行 cronjob 并每秒工作。cron 从000毫秒开始。我需要它在特定时间开始。例如,如果我采取以下内容:c := cron.New() c.AddFunc("@every 1s", func() {        // Do Something     }) c.Start()并在 epoc 时间戳运行它,1657713890300然后我希望函数在以下时间运行:165771389130016577138923001657713893300.目前,cron 运行于165771389100016577138920001657713893000.这可能吗?
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

当您使用@every 1s库时,会创建一个ConstantDelaySchedule“循环,以便下一次激活时间将在第二个”。

如果这不是您想要的,那么您可以创建自己的调度程序(游乐场):

package main


import (

    "fmt"

    "time"


    "github.com/robfig/cron/v3"

)


func main() {

    time.Sleep(300 * time.Millisecond) // So we don't start cron too near the second boundary

    c := cron.New()


    c.Schedule(CustomConstantDelaySchedule{time.Second}, cron.FuncJob(func() {

        fmt.Println(time.Now().UnixNano())

    }))

    c.Start()

    time.Sleep(time.Second * 5)

}


// CustomConstantDelaySchedule is a copy of the libraries ConstantDelaySchedule with the rounding removed

type CustomConstantDelaySchedule struct {

    Delay time.Duration

}


// Next returns the next time this should be run.

func (schedule CustomConstantDelaySchedule) Next(t time.Time) time.Time {

    return t.Add(schedule.Delay)

}

Follow up: 上面使用的是time.Timepassed to Nextwhich is time.Now()so will the time会随着时间慢慢推进。

解决这个问题是可能的(见下文 -游乐场),但这样做会引入一些潜在的发行者(CustomConstantDelaySchedule不能重复使用,如果作业运行时间太长,那么你仍然会以差异告终)。我建议您考虑放弃 cron 包,而只使用time.Ticker.

package main


import (

    "fmt"

    "time"


    "github.com/robfig/cron/v3"

)


func main() {

    time.Sleep(300 * time.Millisecond) // So we don't start cron too nead the second boundary

    c := cron.New()


    c.Schedule(CustomConstantDelaySchedule{Delay: time.Second}, cron.FuncJob(func() {

        fmt.Println(time.Now().UnixNano())

    }))

    c.Start()

    time.Sleep(time.Second * 5)

}


// CustomConstantDelaySchedule is a copy of the libraries ConstantDelaySchedule with the rounding removed

// Note that because this stored the last time it cannot be reused!

type CustomConstantDelaySchedule struct {

    Delay      time.Duration

    lastTarget time.Time

}


// Next returns the next time this should be run.

func (schedule CustomConstantDelaySchedule) Next(t time.Time) time.Time {

    if schedule.lastTarget.IsZero() {

        schedule.lastTarget = t.Add(schedule.Delay)

    } else {

        schedule.lastTarget = schedule.lastTarget.Add(schedule.Delay)

    }

    return schedule.lastTarget

}


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

添加回答

举报

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