Go--cron定時任務
阿新 • • 發佈:2022-12-12
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 {} }