Go的定时器cron
- 1 cron 如果是V3版本,创建对象时如果定时任务粒度要细化到秒级别时,必须携带cron.WithSeconds()参数,V3版本默认不再是支持秒级别定时任务,默认时从分钟域开始执行!
-
func NewCrond(stime string, send func()) {
crontab := cron.New(cron.WithSeconds())
defer crontab.Stop()
crontab.AddFunc(stime, send)
crontab.Start()
select {}
}
package main
import(
"fmt"
cron "github.com/robfig/cron/v3"
)
func main() {
crontab := cron.New()
task := func() {
fmt.Println("hello world")
}
// 添加定时任务, * * * * * 是 crontab,表示每分钟执行一次
crontab.AddFunc("* * * * *", task)
// 启动定时器
crontab.Start()
// 定时任务是另起协程执行的,这里使用 select 简答阻塞.实际开发中需要
// 根据实际情况进行控制
select {}
}
import (
"github.com/robfig/cron/v3"
"fmt"
"time"
)
func main() {
c := cron.New(cron.WithSeconds())
c.AddFunc("*/5 * * * * ?", func(){
fmt.Println("xxx")
})
c.Start()
defer c.Stop()
for {
time.Sleep(time.Second)
}
}
- 2 如果是老的版本cron,默认是支持秒级别粒度,不需要携带cron.WithSeconds()参数
import (
"fmt"
"github.com/robfig/cron"
"time"
)
func main() {
c := cron.New()
c.AddFunc("*/1 * * * * ?", func() {
fmt.Println("xxx")
})
go c.Start()
defer c.Stop()
for {
time.Sleep(time.Second)
}
}
- 3 定时参数设定
"/" ==> 指隔多久执行一次
"," ==> 指用来列举一些离散的值和多个范围,例如将周历的域(第 6 个)设置为MON,WED,FRI表示周一、三和五
"-" ==> 指时间间隔范围,比如:在分钟一栏,3-18表示3-18分钟之间,包括3分和18分。
"?" ==> 问号表示每月/每周的任意一天,只能用在月和周的域中.
1 "0 0 0 * * *" 每天的 0点启动 * 通配符可以匹配任何数字
2 "*/5 * * * * *" 表示每隔5秒钟执行一次
3 "*/1 * * * *" 表示每隔1分钟执行一次,比秒级别解析器少了个*
4 "30 * * * *" 分钟域为 30,其他域都是*表示任意。每30分触发
5 "30 3-6,20-23 * * *":分钟域为 30,小时域的3-6,20-23表示 3 点到 6 点和 20 点到 23 点。每小时的30 分钟触发.
6 "0 0 0 * * ?" 表示每天0点执行一次
7 "0 0 1 1 * ?" 表示每月1号凌晨1点执行一次
8 "0 1,2,3 * * * ?" 表示在1分,2分,3分执行一次
9 "0 0 0,1,2 * * ?" 表示每天的0点,1点,2点执行一次
- 4 如果解析器不指定秒级别粒度,V3默认时以分为粒度,时间参数会长短不一样,下面是5个参数,指定秒级就是6个参数!!!
func main() {
c := cron.New() //自定义解析器
c.AddFunc("*/1 * * * *", func() { //注意,这里,跟秒级别有差别
fmt.Println("每隔1分钟", time.Now().Format("2006-01-02 15:04:05"))
})
// c.AddFunc() 可以同时进行多个定时任务.
go c.Start()
defer c.Stop()
for {
time.Sleep(time.Second)
}
}
作者:are_you_ok_
链接:https://www.jianshu.com/p/12c9cb7dc013
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。