Go語(yǔ)言中定時(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 維基百科頁(yè)面所描述的標(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來(lái)替代cron表達(dá)式。分別表示每年,每月、每星期、每天、每小時(shí)。
還可以用@every <duartion>來(lái)表示間隔時(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方法。不過(guò)一般可以直接用下面講的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方法開(kāi)始執(zhí)行任務(wù)
func main() {
c := cron.New()
c.AddJob("@every 1s", MyJob(func() {
fmt.Println("myjob")
}))
c.AddFunc()
c.Start()
select {}
}到此這篇關(guān)于Go語(yǔ)言中定時(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)類型、編譯型的編程語(yǔ)言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計(jì),它提供了各種內(nèi)置的函數(shù)和特性,幫助開(kāi)發(fā)人員編寫簡(jiǎn)潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時(shí)以及如何有效地使用它們2023-10-10
Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用
這篇文章主要介紹了Golang協(xié)程池的實(shí)現(xiàn)與應(yīng)用,使用協(xié)程池的好處是減少在創(chuàng)建和銷毀協(xié)程上所花的時(shí)間以及資源的開(kāi)銷,解決資源不足的問(wèn)題,需要詳細(xì)了解可以參考下文2023-05-05
Go語(yǔ)言中g(shù)o?mod?vendor使用方法
go mod vendor的功能是將新增的依賴包自動(dòng)寫入當(dāng)前項(xiàng)目的 vendor目錄,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中g(shù)o?mod?vendor使用的相關(guān)資料,需要的朋友可以參考下2022-10-10
Go語(yǔ)言編程學(xué)習(xí)golang配置golint
這篇文章主要為大家介紹了Go語(yǔ)言編程學(xué)習(xí)golang配置golint的過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
golang字符串轉(zhuǎn)Time類型問(wèn)題
本文主要介紹了golang字符串轉(zhuǎn)Time類型問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
golang連接redis庫(kù)及基本操作示例過(guò)程
這篇文章主要介紹了golang連接redis庫(kù)及基本操作示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解
這篇文章主要為大家介紹了Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言擴(kuò)展原語(yǔ)之ErrGroup的用法詳解
除標(biāo)準(zhǔn)庫(kù)中提供的同步原語(yǔ)外,Go語(yǔ)言還在子倉(cāng)庫(kù)sync中提供了4種擴(kuò)展原語(yǔ),本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下2023-07-07
go引入自建包名報(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

