Go語言中定時任務(wù)庫Cron使用方法介紹
快速入門
安裝cron,注意這里安裝的是v3版本。新版本和舊版時間使用有所區(qū)別
go get github.com/robfig/cron/v3@v3.0.0
在項目中導入
import "github.com/robfig/cron/v3"
v3版本的github.com/robfig/cron/v3
默認解析器符合Cron 維基百科頁面所描述的標準
用法大致如下
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { c := cron.New() c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") }) c.AddFunc("30 3-6,20-23 * * *", func() { fmt.Println(".. in the range 3-6am, 8-11pm") }) c.AddFunc("CRON_TZ=Asia/Tokyo 30 04 * * *", func() { fmt.Println("Runs at 04:30 Tokyo time every day") }) c.AddFunc("@hourly", func() { fmt.Println("Every hour, starting an hour from now") }) c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty, starting an hour thirty from now") }) c.Start() select {} }
Cron表達式格式
一個 cron 表達式表示一組時間,使用 5 個空格分隔的字段。這是v3版本默認支持的格式。
Field name | Mandatory? | Allowed values | Allowed special characters ---------- | ---------- | -------------- | -------------------------- Minutes | Yes | 0-59 | * / , - Hours | Yes | 0-23 | * / , - Day of month | Yes | 1-31 | * / , - ? Month | Yes | 1-12 or JAN-DEC | * / , - Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
如果要想在v3版本中也支持秒級別的解析,需要自定義解析器。代碼如下
Field name | Mandatory? | Allowed values | Allowed special characters ---------- | ---------- | -------------- | -------------------------- Seconds | Yes | 0-59 | * / , - Minutes | Yes | 0-59 | * / , - Hours | Yes | 0-23 | * / , - Day of month | Yes | 1-31 | * / , - ? Month | Yes | 1-12 or JAN-DEC | * / , - Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
func main() { // Seconds field, required cron.New(cron.WithSeconds()) // Seconds field, optional cron.New(cron.WithParser(cron.NewParser( cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor, ))) }
預(yù)定義時間表
可以用@yearly
、@monthly
、@weekly
、@weekly
、@daily
、@hourly
來替代cron表達式。分別表示每年,每月、每星期、每天、每小時。
還可以用@every <duartion>
來表示間隔時間,即間隔<duration>
執(zhí)行一次任務(wù)。<duration>
只要可以被time.ParseDuration()
解析即可
設(shè)置時區(qū)
func main() { cron.New( cron.WithLocation(time.UTC)) }
常用的方法介紹
New()
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { // 創(chuàng)建一個默認的cron對象 c := cron.New() // 自定義解析器 cron.New(cron.WithSeconds()) // Seconds field, optional cron.New(cron.WithParser(cron.NewParser( cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor, ))) select {} }
AddJob()
// 有兩個參數(shù),第一個參數(shù)可以是cron表達式或者預(yù)定義時間表,第二個Job func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error) // Job是一個接口,有一個Run方法 type Job interface { Run() }
自定義個一個func類型,實現(xiàn)Run方法。不過一般可以直接用下面講的AddFunc
方法即可
package main import ( "fmt" "github.com/robfig/cron/v3" ) type MyJob func() func (f MyJob) Run() { fmt.Println("myJob") } func main() { c := cron.New() c.AddJob("@every 1s", MyJob(func() { fmt.Println("myjob") })) c.Start() select {}
AddFunc()
// 有兩個參數(shù),第一個參數(shù)可以是cron表達式或者預(yù)定義時間表,第二個傳入一個函數(shù),就是要執(zhí)行的任務(wù) // 會返回一個Id和error // 會把傳入的cmd func轉(zhuǎn)成FuncJob。FuncJob實現(xiàn)了Job接口 func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) { return c.AddJob(spec, FuncJob(cmd)) }
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { c := cron.New() Id, err := c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") }) // Id可以用做取消任務(wù) c.Remove(Id) select {} }
Start()
調(diào)用start方法開始執(zhí)行任務(wù)
func main() { c := cron.New() c.AddJob("@every 1s", MyJob(func() { fmt.Println("myjob") })) c.AddFunc() c.Start() select {} }
到此這篇關(guān)于Go語言中定時任務(wù)庫Cron使用詳解的文章就介紹到這了,更多相關(guān)Go定時任務(wù)庫Cron內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途
Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語言,專為構(gòu)建可擴展、并發(fā)和高效的軟件而設(shè)計,它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時以及如何有效地使用它們2023-10-10Golang協(xié)程池的實現(xiàn)與應(yīng)用
這篇文章主要介紹了Golang協(xié)程池的實現(xiàn)與應(yīng)用,使用協(xié)程池的好處是減少在創(chuàng)建和銷毀協(xié)程上所花的時間以及資源的開銷,解決資源不足的問題,需要詳細了解可以參考下文2023-05-05go引入自建包名報錯:package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報錯:package?XXX?is?not?in?std的解決辦法,這是在寫測試引入包名的時候遇到的錯誤提示,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2023-12-12