網站首頁 編程語言 正文
前言
在平時的開發需求中,我們經常會有一些重復執行的操作需要觸發執行,和系統約個時間,在幾點幾分幾秒或者每隔幾分鐘跑一個任務,說白了就是定時任務,,想必大家第一反應都是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"
Demo
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表達式格式
標準格式
一個 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()
解析即可。
常用的方法介紹
new()
會根據本地時間創建一個新(空白)的計劃任務實例
// 創建一個默認的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, )))
AddJob()
// 有兩個參數,第一個參數可以是cron表達式或者預定義時間表,第二個Job func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error) // Job是一個接口,有一個Run方法 type Job interface { Run() }
AddFunc()
會向計劃任務實例中添加一個回調函數,按指定時間表執行回調函數。
// 有兩個參數,第一個參數可以是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()
調用start方法開始執行任務
相關推薦
Go第三方庫之cronexpr——解析 crontab 表達式
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 設置,指不定哪一天就用上了。
原文鏈接:https://juejin.cn/post/7133086081822441509
相關推薦
- 2022-04-04 使用ivew開發樣式偶爾失效,布局錯亂
- 2023-03-16 PostgreSQL?復制表的?5?種方式詳解_PostgreSQL
- 2022-05-18 opencv?canny邊緣檢測算法詳解_python
- 2023-01-03 python案例中Flask全局配置示例詳解_python
- 2022-05-17 Redis調用Lua腳本及使用場景快速掌握_Redis
- 2022-04-10 vscode快速輸出格式化console.log
- 2022-08-06 .Net?Core中使用EFCore生成反向工程_實用技巧
- 2022-11-17 Python操作MongoDB的教程詳解(插,查,改,排,刪)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支