Go語言中定時(shí)任務(wù)庫(kù)Cron使用方法介紹
快速入門
安裝cron,注意這里安裝的是v3版本。新版本和舊版時(shí)間使用有所區(qū)別
go get github.com/robfig/cron/v3@v3.0.0
在項(xiàng)目中導(dǎo)入
import "github.com/robfig/cron/v3"
v3版本的github.com/robfig/cron/v3
默認(rèn)解析器符合Cron 維基百科頁面所描述的標(biāo)準(zhǔn)
用法大致如下
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表達(dá)式格式
一個(gè) cron 表達(dá)式表示一組時(shí)間,使用 5 個(gè)空格分隔的字段。這是v3版本默認(rèn)支持的格式。
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版本中也支持秒級(jí)別的解析,需要自定義解析器。代碼如下
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ù)定義時(shí)間表
可以用@yearly
、@monthly
、@weekly
、@weekly
、@daily
、@hourly
來替代cron表達(dá)式。分別表示每年,每月、每星期、每天、每小時(shí)。
還可以用@every <duartion>
來表示間隔時(shí)間,即間隔<duration>
執(zhí)行一次任務(wù)。<duration>
只要可以被time.ParseDuration()
解析即可
設(shè)置時(shí)區(qū)
func main() { cron.New( cron.WithLocation(time.UTC)) }
常用的方法介紹
New()
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { // 創(chuàng)建一個(gè)默認(rèn)的cron對(duì)象 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()
// 有兩個(gè)參數(shù),第一個(gè)參數(shù)可以是cron表達(dá)式或者預(yù)定義時(shí)間表,第二個(gè)Job func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error) // Job是一個(gè)接口,有一個(gè)Run方法 type Job interface { Run() }
自定義個(gè)一個(gè)func類型,實(shí)現(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()
// 有兩個(gè)參數(shù),第一個(gè)參數(shù)可以是cron表達(dá)式或者預(yù)定義時(shí)間表,第二個(gè)傳入一個(gè)函數(shù),就是要執(zhí)行的任務(wù) // 會(huì)返回一個(gè)Id和error // 會(huì)把傳入的cmd func轉(zhuǎn)成FuncJob。FuncJob實(shí)現(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語言中定時(shí)任務(wù)庫(kù)Cron使用詳解的文章就介紹到這了,更多相關(guān)Go定時(shí)任務(wù)庫(kù)Cron內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途
Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計(jì),它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡(jiǎn)潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時(shí)以及如何有效地使用它們2023-10-10Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用
這篇文章主要介紹了Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用,使用協(xié)程池的好處是減少在創(chuàng)建和銷毀協(xié)程上所花的時(shí)間以及資源的開銷,解決資源不足的問題,需要詳細(xì)了解可以參考下文2023-05-05Go語言編程學(xué)習(xí)golang配置golint
這篇文章主要為大家介紹了Go語言編程學(xué)習(xí)golang配置golint的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解
這篇文章主要為大家介紹了Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std的解決辦法,這是在寫測(cè)試引入包名的時(shí)候遇到的錯(cuò)誤提示,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12