網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
項(xiàng)目中經(jīng)常有定時(shí)任務(wù)的需求,一般都是利用linux的cron命令,定時(shí)執(zhí)行腳本,無(wú)論從管理上來(lái)說(shuō)還是從開發(fā)上來(lái)說(shuō)都不是最好的方案,要是能在項(xiàng)目里直接開發(fā)定時(shí)任務(wù),就比較完美了。
golang利用goroutine外加github.com/gorhill/cronexpr庫(kù)就可實(shí)現(xiàn)定時(shí)任務(wù),代碼簡(jiǎn)單,原理簡(jiǎn)單。
cronexpr庫(kù)
定時(shí)語(yǔ)法介紹
該庫(kù)是一個(gè)定時(shí)字符串規(guī)則解析庫(kù),同linux中的cron類似,但是可以精確到秒,也可以設(shè)定年,可以直接到git里查看,這里只對(duì)最常用的規(guī)則進(jìn)行解釋。
索引 | 字段名 | 是否必須 | 值范圍 | 可用字符串 |
---|---|---|---|---|
1 | 秒 | 否 | 0-59 | * / , - |
2 | 分 | 是 | 0-59 | * / , - |
3 | 時(shí) | 是 | 0-23 | * / , - |
4 | 日(月中) | 是 | 1-31 | * / , - L W |
5 | 月 | 是 | 1-12 | * / , - |
6 | 日(星期中) | 是 | 0-6 | * / , - L # |
7 | 年 | 否 | 1970-2099 | * / , - |
- 星號(hào)(*) 表示該字段所有的值,例:每秒 、每天。
- 斜線(/) 范圍增量,例: 分鐘 3-59/15 表示3分到59分中從第3分開始,每15分中一次,分鐘 */15 表示0-59分鐘,從0分鐘開始,每15分鐘1次。*在這里表示全范圍。
- 逗號(hào)(,) 分割列表中的項(xiàng)目,例:星期1,星期2,星期3 表示為 0,1,2
- 連字符(-) 表示范圍,列,2000年到2010年表示為 2000-2010
L w # 不常用
常用定時(shí)
每日 即每天凌晨零點(diǎn):0 0 0 * * * *
每日凌晨2點(diǎn): 0 0 2 * * * *
每月開始: 0 0 0 1 * * *
每周開始: 0 0 0 * * 1 * 注意 0是星期天
定時(shí)代碼
func Task () { cron := cronexpr.MustParse("0 0 0 * * * *") //用cron庫(kù)生成一個(gè)cronexpr.Expression對(duì)象 next := cron.Next(time.Now()) //計(jì)算下次觸發(fā)時(shí)間的時(shí)間對(duì)象 for { now := time.Now() //每次循環(huán)計(jì)算獲取當(dāng)前時(shí)間 if next.Before(now) || next.Equal(now) { //下次觸發(fā)時(shí)間與當(dāng)前時(shí)間進(jìn)行對(duì)比,等于或者時(shí)間已到 則進(jìn)行任務(wù)觸發(fā) ... //此處填寫任務(wù)代碼 next = cron.Next(now) //重新計(jì)算下次任務(wù)時(shí)間的時(shí)間對(duì)象 } select { case <-time.NewTicker(time.Second).C: //每秒掃描一遍 循環(huán)頻率設(shè)定 } } }
代碼里注釋已經(jīng)很清楚了。在整理一下步驟:
- 先根據(jù)定時(shí)規(guī)則生成一個(gè) cronexpr.Expression 對(duì)象,簡(jiǎn)稱cron對(duì)象。
- 循環(huán)中判斷當(dāng)前時(shí)刻和cron計(jì)算的下次時(shí)刻是否已經(jīng)到達(dá)。
- 已經(jīng)到達(dá)則運(yùn)行定時(shí)任務(wù)代碼并重新計(jì)算下次到達(dá)時(shí)刻。
- 設(shè)定循環(huán)頻率,根據(jù)實(shí)際情況設(shè)定循環(huán)頻率。
結(jié)語(yǔ)
golang定時(shí)任務(wù)的代碼很簡(jiǎn)單,定時(shí)任務(wù)規(guī)則語(yǔ)法與linux cron相似,我總是記不住,每次用到時(shí)候就去翻git翻以前做過(guò)的代碼,這次總結(jié)一下,下次直接翻這篇文章了,你也可以收藏起來(lái),用到時(shí)候查詢一下。
原文鏈接:https://juejin.cn/post/7144358837145829384
相關(guān)推薦
- 2022-08-22 Git配置別名簡(jiǎn)化操作命令方式詳解_相關(guān)技巧
- 2022-01-03 yarn版本過(guò)低導(dǎo)致的報(bào)錯(cuò)
- 2022-04-25 Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例_Golang
- 2022-08-30 MongoDB集合的增刪改查管理_MongoDB
- 2022-07-10 理解setuid()、setgid()和sticky位
- 2022-11-05 swift語(yǔ)言AutoreleasePool原理及使用場(chǎng)景_Swift
- 2023-05-15 shell?提取文件名和目錄名的方法實(shí)現(xiàn)_linux shell
- 2022-08-25 C++詳細(xì)講解互斥量與lock_guard類模板及死鎖_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支