定时任务
服务端经常会有后台定时任务的需求,最近公司在将部分服务改造为Go实现,Go有一个robfig/cron的实现,只支持cron表达式。他后台的运行模式是当有一任务达到执行时间则启动一个协程来执行任务,只要到达了执行时间不管上一次任务执行是否完成都会在启动一个协程执行这个任务,假设我这里有一个任务是一分钟执行一次,但是任务执行时间不是很确定可能在一分钟内结束也可能超过一分钟,那么就有可能出现一个任务被多个协程执行的并发问题。用过Java的人一定知道spring schedule,它支持Cron表达式、FixedDelay、FixedRate的三种模式,Cron跟Go的robfig/cron实现是一样的,FixedDelay则是当前任务执行完再开始延迟一定时间执行下一次任务,FixedRate则是当前任务开始执行则开始计时下一次任务,但是如果当前任务执行时间超过了任务该执行的时间也要等到当前任务执行完才执行,更细节的解释可以参考这篇文章原理暂且不谈,定时器你当真会用。所以我这里参考Java的实现,实现了Go的Cron,它支持Cron表达式、FixedDelay、FixedRate的三种模式。github地址 go-cron。有需求的可以拉下来测试测试,目前发布了一个1.0.0的beta版
example
import "github.com/wangbaolong/go-cron/cron"
var schedule = cron.NewSchedule()
schedule.Schedule("Scheduled", 300, func() {
logger.Info("A task exec")
})
schedule.ScheduleAtFixedRate("ScheduleAtFixedRate", 5, 5, func() {
logger.Info("B task running spend time 10s")
time.Sleep(time.Second * 10)
})
schedule.ScheduleWithFixedDelay("ScheduleWithFixedDelay", 5, 5, func() {
logger.Info("C task running spend time 10s")
time.Sleep(time.Second * 10)
})
_ = schedule.ScheduleWithSpec("specTask", "*/20 * * * * *", func() {
logger.Info("D task running spend time 2min")
time.Sleep(time.Minute * 2)
})
_ = schedule.ScheduleWithSpec("specTask", "@every 10s", func() {
logger.Info("E task running spend time 2min")
time.Sleep(time.Minute * 2)
})
// schedule.ShutdownNow()
在服务端开发中,定时任务是常见的需求。本文介绍了Go中的robfig/cron库,它支持cron表达式,但可能引发并发执行问题。为解决此问题,作者参照Java的Spring Schedule,实现了一个Go的Cron库,支持Cron、FixedDelay和FixedRate三种模式,并提供了github地址供测试使用。
1213

被折叠的 条评论
为什么被折叠?



