经常会有些定时任务需要执行,以前php中,我们可能就写一个脚本,然后在服务器上写好crontab 定时执行,又或者通过开源的工具 xxljob 执行php 的命令, go 因为我们可以启动一个常驻内存的服务,goroutine 中引入工具包robfig/cron 提供一个类似上面xxljob 一样的对外服务,我们可以添加兼容crontab 写法的任务到服务中,然后执行。了解一下源码是怎么写的。
先声明几个用到定时任务可能遇到的误区:
- * /1 , 分时日月周,每小时执行一次,他代表的是 1, 2, 3,4,····这些整数点执行,而不是从现在开始的 每隔一小时执行一次,下一次的运行时间是通过解析 crontab 表达式,算出下次执行的时间,算出差值,然后启动一个time.after, select {} 鉴定这些channel, 获取到值之后,遍历任务,获取next time ,判断否需要有执行的,如果有执行的直接启动一个goroutine执行。
- 同一种类型任务,比如每秒执行,前一个还没执行完,下次是否会执行。正常情况下是会执行的,因为这些任务都是异步的,每个任务都是goroutine,所以哪怕你执行1辈子,也不会影响同一类型任务下次执行。
chain.go
1 | 这个文件的作用就是一些公用方法包装我们的任务 |
constantdelay.go
1 | package cron |
cron.go
1 | 核心任务管理器了 |
option.go 很简单,就是一些配置项
1 | package cron |
loger.go 这个很经典的loger
1 | package cron |
parser.go, spec.go 这两个文件都是关于 crontab 的解析,很难看不懂啦