robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式。其源码值得一读, 低耦合高内聚体现地淋漓尽致,其中涉及的装饰器模式,并发处理等都很值得学习。
如果是 0 30 * * * *, 那就是每个 xx:00 和 xx:30 执行
而如果是@every 10m, 则是从当前时间起(服务启动时间),每30分钟执行一次,未必是xx:00,xx:30时刻执行
参考一不留神就掉坑, 可利用在线工具查看具体执行时间
cron.SkipIfStillRunning干什么用的
cron.SkipIfStillRunning 是 Go 语言的一个 cron 库(定时任务库)中的函数,用于在一个定时任务执行期间,避免在上一个任务还未完成时,重复触发新的任务。
当多个定时任务被同时触发时,如果其中一个任务的执行时间比较长,可能会导致这个任务的多次重复执行,从而出现问题。这时可以使用 SkipIfStillRunning 函数来避免这种情况的发生。
SkipIfStillRunning 函数的作用是,当一个任务正在执行时,如果定时器再次触发该任务,它会检查上一个任务是否已经完成,如果没有完成,则会跳过这个任务,等待上一个任务完成后再次触发。这样可以确保同一个任务在同一时间只有一个实例在执行,避免重复执行和数据竞争等问题。
SkipIfStillRunning 函数的原型为:
1 | func SkipIfStillRunning(ctx context.Context, job func() error) error |
其中,参数 ctx 是一个 context.Context 类型的变量,用于控制任务的生命周期,参数 job 是一个函数类型的变量,用于定义需要执行的任务。函数会返回一个 error 类型的值,表示任务执行过程中可能出现的错误。
1 | _, err = t.c.AddJob("@every 1m", cron.NewChain(cron.SkipIfStillRunning(cron.DefaultLogger)).Then(&deleteXxxxxLog{})) |
在另一个文件里定义一个结构体
1 |
|
其相关源码,可参考:
Golang 定时任务 github/robfig/cron/v3 使用与源码解析
Golang crontab定时执行任务(github.com/robfig/cron)
原文链接: https://dashen.tech/2017/02/22/robfig-cron使用小结/
版权声明: 转载请注明出处.