1. 程式人生 > 其它 >Go--cron定時任務

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 github.com/robfig/cron
go get github.com/robfig/cron/[email protected]

用法介紹:

用法與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= + 具體時區,具體時區的格式在之前carbon的文章中有詳細介紹。東京時區為Asia/Tokyo,紐約時區為America/New_York;
  • 建立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 {}
}