<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在平時的開發需求中,我們經常會有一些重複執行的操作需要觸發執行,和系統約個時間,在幾點幾分幾秒或者每隔幾分鐘跑一個任務,說白了就是定時任務,,想必大家第一反應都是linux的Crontab。其實定時任務不止使用系統自帶的Crontab,在Go語言中也可以使用Cron定時任務庫, 這篇文章給大家介紹如何在go專案中實現一個crontab功能,感興趣的小夥伴們可以參考借鑑,希望對大家能有所幫助。
golang 實現定時服務很簡單,只需要簡單幾步程式碼便可以完成,不需要設定繁瑣的伺服器,直接在程式碼中實現。
使用 github.com/robfig/cron 這個包,robfig/cron是一個第三方開源的任務排程庫,也就是我們平時說的定時任務,它實現了 cron 規範解析器和任務執行器。
go get github.com/robfig/cron/v3@v3.0.0
import "github.com/robfig/cron/v3"
package main import ( "fmt" "github.com/robfig/cron/v3" ) func main() { // 建立一個預設的cron物件 c := cron.New() //新增執行任務 c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") }) 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 表示式表示一組時間,使用 5 個空格分隔的欄位。這是v3版本預設支援的格式,沒有Seconds。在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 | * / , - ?
可以用@yearly
、@monthly
、@weekly
、@weekly
、@daily
、@hourly
來替代cron表示式。分別表示每年,每月、每星期、每天、每小時。
還可以用@every <duartion>
來表示間隔時間,即間隔執行一次任務。只要可以被time.ParseDuration()
解析即可。
會根據本地時間建立一個新(空白)的計劃任務範例
// 建立一個預設的cron物件 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, )))
// 有兩個引數,第一個引數可以是cron表示式或者預定義時間表,第二個Job func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error) // Job是一個介面,有一個Run方法 type Job interface { Run() }
會向計劃任務範例中新增一個回撥函數,按指定時間表執行回撥函數。
// 有兩個引數,第一個引數可以是cron表示式或者預定義時間表,第二個傳入一個函數,就是要執行的任務 // 會返回一個Id和error // 會把傳入的cmd func轉成FuncJob。FuncJob實現了Job介面 func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) { return c.AddJob(spec, FuncJob(cmd)) }
呼叫start方法開始執行任務
cronexpr 是一個 crontab 解析表示式的庫,我們可以根據當前時間獲取到下次執行的時間。具體用法如下:
go get github.com/gorhill/cronexpr //下載 import "github.com/gorhill/cronexpr" //匯入
demo:
package main import ( "fmt" "time" "github.com/gorhill/cronexpr" ) func doTask() { fmt.Println("I am running, time is: ", time.Now()) } func main() { // 每隔 5 秒執行1次 expr, err := cronexpr.Parse("*/10 * * * * * * ") // 如果表示式解析錯誤將返回一個錯誤 if err != nil { fmt.Println(err) return } //獲取下次執行時間 nextTime := expr.Next(time.Now()) fmt.Println(nextTime) time.AfterFunc(time.Until(nextTime), doTask) //返回當前crontab後的5次執行,n為次數 nextTimeList = cronexpr.MustParse("*/10 * * * * * * ").NextN(time.Now(), 5) for _, v := range nextTimeList { fmt.Println(v.String()) } time.Sleep(10 * time.Second) }
定時任務很常見,希望你通過本文能夠熟知 Golang 怎麼實現一個簡單的定時任務排程管理
可以不依賴系統的 Crontab 設定,指不定哪一天就用上了。
到此這篇關於一文帶你入門Go語言中定時任務庫Cron的使用的文章就介紹到這了,更多相關Go語言定時任務庫Cron內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45