Golang定时任务简单实现
下载cron包:
go get github.com/robfig/cron
开启一个定时:
根据cron表达式进行时间调度,cron可以精确到秒,大部分表达式格式也是从秒开始。
c := cron.New()默认从分开始,所以加上cron.WithSeconds(),保证定时按照表达式字面意思执行。
func main() { c := cron.New(cron.WithSeconds()) //精确到秒 //定时任务 spec := "*/1 * * * * ?" //cron表达式,每秒一次 c.AddFunc(spec, func() { fmt.Println("11111") }) c.Start() select {} //阻塞主线程停止 }
停止定时:
由于goroutine没有线程id,所以无法从外部停止指定的定时任务。cron自带Stop()方法,支持在方法体里使用,来停止当前定时。
何时调用Stop()方法,需要根据自身业务触发,例如运行完成100次后停止,数据库当前状态为注销时停止,等等。
func main() { c := cron.New(cron.WithSeconds()) //精确到秒 //定时任务 spec := "*/1 * * * * ?" //cron表达式,每秒一次 c.AddFunc(spec, func() { status := getStatus() //获取定时任务的状态 if status == true { fmt.Println("11111") } else { c.Stop() //当前定时任务状态已注销 } }) c.Start() select {} //阻塞主线程停止 }
开启多个定时:
一个c对象可以加载多个定时任务,此时在其中一个方法里调用Stop()方法,所有定时任务都会停止。
func main() { c := cron.New(cron.WithSeconds()) //精确到秒 //定时任务 spec := "*/1 * * * * ?" //cron表达式,每秒一次 c.AddFunc(spec, func() { fmt.Println("11111") }) spec1 := "*/5 * * * * ?" //cron表达式,每5秒一次 c.AddFunc(spec1, func() { fmt.Println("22222") }) c.Start() select {} //阻塞主线程停止 }
常见cron表达式:
表达式如果算上年份,共7位:
秒 分 时 日 月 周 年
实际应用中很少用到年份,所以一般表达式都是6位:
秒 分 时 日 月 周
*/1 * * * * ? 每秒
00 * * * * ? 每分
00 30 22 * * ? 每天晚上22:30
00 30 22 * * 2 每周二晚上22:30
00 30 22 * * 1,3 每周一和周三晚上22:30
*/5 35 10 * * 1-3 每周一到周三上午10点35分00秒开始第一次,然后每5秒一次
00 10,40 14 ? 3 4 每年三月的星期四的下午14:10和14:40
需要更复杂更细致的表达式写法,可自行上网查找。
注意:
网上有很多不同的cron包,同一个包版本也有多个,整体用法虽相似,但对cron表达式的处理会有一定差别,例如c := cron.New()有直接从秒开始的,不用加cron.WithSeconds(),也有用5位长度来指定表达式的。
所以,具体使用哪个包,最好下载更新最新版本,表达式的语法也要通过实际测试进行验证,保证任务按照我们指定的时间执行。
公众号:李田路口