猿问

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

我正在使用github.com/robfig/cron库。我想以毫秒为单位在 epoc 时间运行 cronjob 并每秒工作。cron 从000毫秒开始。我需要它在特定时间开始。

例如,如果我采取以下内容:

c := cron.New()
c.AddFunc("@every 1s", func() { 
      // Do Something 
   })
c.Start()

并在 epoc 时间戳运行它,1657713890300然后我希望函数在以下时间运行:

  • 1657713891300

  • 1657713892300

  • 1657713893300.

目前,cron 运行于

  • 1657713891000

  • 1657713892000

  • 1657713893000.

这可能吗?


阿晨1998
浏览 117回答 1
1回答

宝慕林4294392

当您使用@every 1s该库时,会创建一个ConstantDelaySchedule“循环,以便下一次激活时间将在第二个”。如果这不是您想要的,那么您可以创建自己的调度程序(游乐场):package mainimport (    "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 removedtype 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 mainimport (    "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}
随时随地看视频慕课网APP

相关分类

Go
我要回答