Go--cron定时任务
Cron是Go中用于设置定时任务的一个库,需要注意的是,Cron库分两个大版本,v1.2和v3.0,其功能和go get地址都是不同的,注意区分。
v1.2官方文档:https://pkg.go.dev/github.com/robfig/cron
v3官方文档:https://pkg.go.dev/github.com/robfig/cron/v3
区别:
- v1.2版本默认支持精确到秒的cron表达式
- v3版本默认不再是支持秒级别定时任务,而是从分钟域开始执行,要细化到秒级别时,必须携带cron.WithSeconds()参数
- v3支持定时任务的撤销功能
下载:
go get -u github.com/robfig/cron go get -u github.com/robfig/cron/v3
用法介绍:
用法与linux的crontab类似,不过多了个秒级别
* * * * * * //依次是 秒 分 时 日 月 周
特殊字符:
- ? 只能在day跟week中使用,标识未说明的值,用以解决day跟week的冲突,比如 * * * 10 * ? 表示每月10号触发,而换成 * 则表示不管星期几都可触发,与前者发生冲突
- L 表示last,只能在day跟week中使用,每月最后一天或者每周最后一天(星期六)触发
- W 只能在day中使用,表示最接近指定天的工作日(周一至周五),例:5W,每月第5天的工作日触发,若当天是星期六,则提前,若是星期天,则往后触发;不跨月份
预定义模式(用于AddFunc()):
模式 | 描述 | 等价于 |
@yearly (or @annually) | 每年一次,一月一日午夜 | 0 0 0 1 1 * |
@monthly | 每月运行一次,每月第一天午夜 | 0 0 0 1 * * |
@weekly | 每周运行一次,周六/周日午夜 | 0 0 0 * * 0 |
@daily (or @midnight) | 每天运行一次,当天午夜 | 0 0 0 * * * |
@hourly | 每小时的开始运行一次 | 0 0 * * * * |
@every | 每个持续的时间 | 例:c.AddFunc("@every 1s",func() {}) |
设置时区:
默认情况下,所有时间都是基于当前时区的,也可自定义
- 在时间字符串前面添加一个CRON_TZ= + 具体时区
- 东京时区:Asia/Tokyo
- 纽约时区:America/New_York
- 上海时区:Asia/Shanghai
- 香港时区:Asia/Hong_Kong
- 创建cron对象时增加一个时区选项cron.WithLocation(location),location为time.LoadLocation(zone)加载的时区对象,zone为具体的时区格式。或者调用已创建好的cron对象的SetLocation()方法设置时区
func main() { //直接配置时区 nyc, _ := time.LoadLocation("America/New_York") c := cron.New(cron.WithLocation(nyc)) //cron.New(cron.WithLocation(time.UTC)) c.AddFunc("0 6 * * ?", func() { fmt.Println("Every 6 o'clock at New York") }) //参数里面配置时区 c.AddFunc("CRON_TZ=Asia/Tokyo 0 6 * * ?", func() { fmt.Println("Every 6 o'clock at Tokyo") })
示例:
v1.2
package main import ( "fmt" "github.com/robfig/cron" ) func cronv1() { fmt.Println("starting...") //创建一个定时任务对象 c := cron.New() //给对象增加定时任务 c.AddFunc("*/5 * * * * *", func() { fmt.Println("hello world 1") }) c.AddFunc("*/8 * * * * *", func() { fmt.Println("hello world 2") }) //启动定时任务 c.Start() } func main() { cronv1() //查询语句,阻塞,让main函数不退出,保持程序运行 select {} }
v3:秒级
package main import ( "fmt" "github.com/robfig/cron/v3" ) func cronv3() { fmt.Println("starting...") //创建一个定时任务对象 c := cron.New(cron.WithSeconds()) //给对象增加定时任务 c.AddFunc("*/5 * * * * *", func() { fmt.Println("hello world 1") }) c.AddFunc("*/8 * * * * *", func() { fmt.Println("hello world 2") }) //启动定时任务 c.Start() } func main() { cronv3() //查询语句,阻塞,让main函数不退出,保持程序运行 select {} }
v3:分钟级
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { //创建一个定时任务对象 c := cron.New() //给对象增加定时任务 c.AddFunc("1 * * * *", func() { fmt.Println("1") }) //启动定时任务 c.Start() //查询语句,阻塞,让main函数不退出,保持程序运行 select {} }