日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

golang?常用定時任務(wù)匯總_Golang

作者:lambdang??????? ? 更新時間: 2022-11-10 編程語言

前言

項(xiàng)目中經(jīng)常有定時任務(wù)的需求,一般都是利用linux的cron命令,定時執(zhí)行腳本,無論從管理上來說還是從開發(fā)上來說都不是最好的方案,要是能在項(xiàng)目里直接開發(fā)定時任務(wù),就比較完美了。

golang利用goroutine外加github.com/gorhill/cronexpr庫就可實(shí)現(xiàn)定時任務(wù),代碼簡單,原理簡單。

cronexpr庫

定時語法介紹

該庫是一個定時字符串規(guī)則解析庫,同linux中的cron類似,但是可以精確到秒,也可以設(shè)定年,可以直接到git里查看,這里只對最常用的規(guī)則進(jìn)行解釋。

索引 字段名 是否必須 值范圍 可用字符串
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次。*在這里表示全范圍。
  • 逗號(,) 分割列表中的項(xiàng)目,例:星期1,星期2,星期3 表示為 0,1,2
  • 連字符(-) 表示范圍,列,2000年到2010年表示為 2000-2010

L w # 不常用

常用定時

每日 即每天凌晨零點(diǎn):0 0 0 * * * *

每日凌晨2點(diǎn): 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()) //計(jì)算下次觸發(fā)時間的時間對象
	for {
		now := time.Now() //每次循環(huán)計(jì)算獲取當(dāng)前時間
		if next.Before(now) || next.Equal(now) {  //下次觸發(fā)時間與當(dāng)前時間進(jìn)行對比,等于或者時間已到 則進(jìn)行任務(wù)觸發(fā)
                    ... //此處填寫任務(wù)代碼
			next = cron.Next(now)  //重新計(jì)算下次任務(wù)時間的時間對象
		}
		select {
		case <-time.NewTicker(time.Second).C: //每秒掃描一遍 循環(huán)頻率設(shè)定
		}
	}
}

代碼里注釋已經(jīng)很清楚了。在整理一下步驟:

  • 先根據(jù)定時規(guī)則生成一個 cronexpr.Expression 對象,簡稱cron對象。
  • 循環(huán)中判斷當(dāng)前時刻和cron計(jì)算的下次時刻是否已經(jīng)到達(dá)。
  • 已經(jīng)到達(dá)則運(yùn)行定時任務(wù)代碼并重新計(jì)算下次到達(dá)時刻。
  • 設(shè)定循環(huán)頻率,根據(jù)實(shí)際情況設(shè)定循環(huán)頻率。

結(jié)語

golang定時任務(wù)的代碼很簡單,定時任務(wù)規(guī)則語法與linux cron相似,我總是記不住,每次用到時候就去翻git翻以前做過的代碼,這次總結(jié)一下,下次直接翻這篇文章了,你也可以收藏起來,用到時候查詢一下。

原文鏈接:https://juejin.cn/post/7144358837145829384

欄目分類
最近更新