Go--cron定时任务

发布时间 2023-11-02 15:47:18作者: 韩梦芫

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 {}

}
复制代码