golang 常用定時任務(wù)匯總
前言
項目中經(jīng)常有定時任務(wù)的需求,一般都是利用linux的cron命令,定時執(zhí)行腳本,無論從管理上來說還是從開發(fā)上來說都不是最好的方案,要是能在項目里直接開發(fā)定時任務(wù),就比較完美了。
golang利用goroutine外加github.com/gorhill/cronexpr庫就可實現(xiàn)定時任務(wù),代碼簡單,原理簡單。
cronexpr庫
定時語法介紹
該庫是一個定時字符串規(guī)則解析庫,同linux中的cron類似,但是可以精確到秒,也可以設(shè)定年,可以直接到git里查看,這里只對最常用的規(guī)則進行解釋。
| 索引 | 字段名 | 是否必須 | 值范圍 | 可用字符串 |
|---|---|---|---|---|
| 1 | 秒 | 否 | 0-59 | * / , - |
| 2 | 分 | 是 | 0-59 | * / , - |
| 3 | 時 | 是 | 0-23 | * / , - |
| 4 | 日(月中) | 是 | 1-31 | * / , - L W |
| 5 | 月 | 是 | 1-12 | * / , - |
| 6 | 日(星期中) | 是 | 0-6 | * / , - L # |
| 7 | 年 | 否 | 1970-2099 | * / , - |
- 星號(*) 表示該字段所有的值,例:每秒 、每天。
- 斜線(/) 范圍增量,例: 分鐘 3-59/15 表示3分到59分中從第3分開始,每15分中一次,分鐘 */15 表示0-59分鐘,從0分鐘開始,每15分鐘1次。*在這里表示全范圍。
- 逗號(,) 分割列表中的項目,例:星期1,星期2,星期3 表示為 0,1,2
- 連字符(-) 表示范圍,列,2000年到2010年表示為 2000-2010
L w # 不常用
常用定時
每日 即每天凌晨零點:0 0 0 * * * *
每日凌晨2點: 0 0 2 * * * *
每月開始: 0 0 0 1 * * *
每周開始: 0 0 0 * * 1 * 注意 0是星期天
定時代碼
func Task () {
cron := cronexpr.MustParse("0 0 0 * * * *") //用cron庫生成一個cronexpr.Expression對象
next := cron.Next(time.Now()) //計算下次觸發(fā)時間的時間對象
for {
now := time.Now() //每次循環(huán)計算獲取當(dāng)前時間
if next.Before(now) || next.Equal(now) { //下次觸發(fā)時間與當(dāng)前時間進行對比,等于或者時間已到 則進行任務(wù)觸發(fā)
... //此處填寫任務(wù)代碼
next = cron.Next(now) //重新計算下次任務(wù)時間的時間對象
}
select {
case <-time.NewTicker(time.Second).C: //每秒掃描一遍 循環(huán)頻率設(shè)定
}
}
}代碼里注釋已經(jīng)很清楚了。在整理一下步驟:
- 先根據(jù)定時規(guī)則生成一個 cronexpr.Expression 對象,簡稱cron對象。
- 循環(huán)中判斷當(dāng)前時刻和cron計算的下次時刻是否已經(jīng)到達(dá)。
- 已經(jīng)到達(dá)則運行定時任務(wù)代碼并重新計算下次到達(dá)時刻。
- 設(shè)定循環(huán)頻率,根據(jù)實際情況設(shè)定循環(huán)頻率。
結(jié)語
golang定時任務(wù)的代碼很簡單,定時任務(wù)規(guī)則語法與linux cron相似,我總是記不住,每次用到時候就去翻git翻以前做過的代碼,這次總結(jié)一下,下次直接翻這篇文章了,你也可以收藏起來,用到時候查詢一下。
到此這篇關(guān)于golang 常用定時任務(wù)匯總的文章就介紹到這了,更多相關(guān)golang 定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go1.20最新資訊go?arena手動管理內(nèi)存鴿了
由于過于繁雜,Go?核心團隊成員@Ian?Lance?Taylor,也表態(tài):目前尚未做出任何決定,也不可能在短期內(nèi)做出任何決定,可以認(rèn)為這個提案基本鴿了,今天這篇文章就是給大家同步目前的情況2023-11-11
基于golang uint8、int8與byte的區(qū)別說明
這篇文章主要介紹了基于golang uint8、int8與byte的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

