亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

用golang實現一個定時器任務隊列實例

2020-04-01 18:57:08
字體:
來源:轉載
供稿:網友

很有幸得到公司信任,采用新的語言進行一些底層服務的開發,在實現功能的同時,也獲得了一些感悟,因此在這記錄一下,方便自己查看也可以共享給大家。

golang定時器

golang中提供了2種定時器timer和ticker(如果JS很熟悉的話應該會很了解),分別是一次性定時器和重復任務定時器。

一般用法:

func main() {  input := make(chan interface{})  //producer - produce the messages go func() {  for i := 0; i < 5; i++ {   input <- i  }  input <- "hello, world" }()  t1 := time.NewTimer(time.Second * 5) t2 := time.NewTimer(time.Second * 10)  for {  select {  //consumer - consume the messages  case msg := <-input:   fmt.Println(msg)   case <-t1.C:   println("5s timer")   t1.Reset(time.Second * 5)   case <-t2.C:   println("10s timer")   t2.Reset(time.Second * 10)  } }}

源碼觀察

這個C是啥,我們去源碼看看,以timer為例:

type Timer struct { C <-chan Time r runtimeTimer}

原來是一個channel,其實有GO基礎的都知道,GO的運算符當出現的->或者<-的時候,必然是有一端是指channel。按照上面的例子來看,就是阻塞在一個for循環內,等待到了定時器的C從channel出來,當獲取到值的時候,進行想要的操作。

設計我們的定時任務隊列

我的需求

當時我的需求是這樣,我需要接收到客戶端的請求并產生一個定時任務,會在固定時間執行,可能是一次,也可能是多次,也可能到指定時間自動停止,可能當任務終止的時候,我還要能停止掉。

具體我畫了個流程圖,差不多如下,畫圖水平有限,請見諒。

golang,定時器,任務隊列

定義結構

type OnceCron struct { tasks []*Task   //任務的列隊 add chan *Task  //當遭遇到新任務的時候 remove chan string  //當遭遇到刪除任務的時候 stop chan struct{}  //當遇到停止信號的時候 Logger *log.Logger  //日志 }type Job interface { Run()     //執行接口}type Task struct {  Job  Job   //要執行的任務  Uuid string   //任務標識,刪除時用 RunTime int64   //執行時間 Spacing int64   //間隔時間 EndTime int64   //結束時間 Number int    //總共要次數}

隊列實現

首先,我們要獲得一個隊列任務

func NewCron() *OnceCron 常規操作,為了節省篇幅,我就不寫出來,具體可以看源碼,貼在了底部。

然后,開始定時器隊列的運行,一般,都會命名為Start。那么就有一個問題,我們剛開始啟動程序的時候,這個時候是沒有任務隊列,那豈不是for{ select{}}在等待個毛毛球?所以,我們需要在Start的時候添加一個默認的任務, 我是這么做的,添加了一個一小時執行一次的重復隊列,防止隊列退出。

func (one *OnceCron) Start() { //初始化的時候加入一個一年的長定時器,間隔1小時執行一次 task := getTaskWithFuncSpacing(3600, time.Now().Add(time.Hour*24*365).Unix() , func() { log.Println("It's a Hour timer!") }) //為了代碼格式markdown 里面有個括號我改成全角了 one.tasks = append(one.tasks, task) go one.run() //協成執行 防止主進程被阻塞}

執行部分應該是重點的,我的理解是,分成三部:

  1. 首先獲得一個最先執行的任務
  2. 然后產生一個定時器,用于執行任務
  3. 進行阻塞判斷,獲取我們要進行的操作
func (one *OnceCron) run() { for {    //第一步 獲取任務 now := time.Now() //獲取到當前時間 task, key := one.GetTask() //獲取最近的一個任務的執行時間 i64 := task.RunTime - now.Unix() //任務執行和當前時間的差 var d time.Duration if i64 < 0 { //如果任務時間已過期,將執行時間改成現在并且利馬執行 one.tasks[key].RunTime = now.Unix()  one.doAndReset(key)      continue } else { //否則,獲取距離執行開始的間隔時間 d = time.Unix(task.RunTime, 0).Sub(now) }    //第二步 產生定時器 timer := time.NewTimer(d)  //第三步 捕獲定時器或者其他事件 for { select {       //當定時器到了執行時間時,執行當前任務并關閉定時器 case <-timer.C: one.doAndReset(key) if task != nil {  go task.Job.Run()  timer.Stop() } //當外部添加了任務時,關閉當前定時器 case <-one.add: timer.Stop() //當外部要刪除一個任務時,刪除ID為uuidstr的任務 case uuidstr := <-one.remove: one.removeTask(uuidstr) timer.Stop() //當遇到要關閉整個定時器任務時 case <-one.stop: timer.Stop() return } break } }}

后記

這個文章純粹為筆記分析類的文章,旨在分析我碰到一個需求是如何通過分析過程來產生我們需要的代碼的。

源碼地址:timing 一個任務隊列

應用地址:一個應用于谷歌消息推送的轉發中間件

參考源碼:GOLANG實現crontab功能 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久7777婷婷| 亚洲视频自拍偷拍| 日韩av综合网站| 成人网欧美在线视频| 国模精品视频一区二区三区| 亚洲女人天堂视频| 91日本在线视频| 亚洲成人网久久久| 欧美成在线观看| 国产精品黄色av| 91高清免费在线观看| 久久久精品国产网站| 美日韩精品免费视频| 久久精品视频在线播放| 欧美成人性色生活仑片| 久久成人在线视频| 欧美日韩一区二区三区在线免费观看| 91系列在线播放| 国产999精品视频| 性欧美亚洲xxxx乳在线观看| 国产精品爱啪在线线免费观看| 成人免费观看49www在线观看| 国产不卡精品视男人的天堂| 欧美在线中文字幕| 久久久久久久久久久人体| 亚洲国产日韩欧美在线99| 日本成熟性欧美| 久久国产一区二区三区| 久久久久久久久电影| 亚洲人成网站免费播放| 精品中文字幕在线观看| 久久久久久久久久国产| 久久久久久亚洲精品| 日韩欧美在线中文字幕| 亚洲精品资源美女情侣酒店| 久久久久这里只有精品| 日本亚洲欧洲色| 国产精品久久不能| 欧美成人免费小视频| 高清亚洲成在人网站天堂| 成人h视频在线| 成人h片在线播放免费网站| 91网站免费观看| 欧美日韩国产专区| 欧美日韩免费在线观看| 日韩精品极品在线观看| 成人伊人精品色xxxx视频| 不卡在线观看电视剧完整版| 97视频免费观看| 一本大道亚洲视频| 亚洲欧美日韩成人| 国产在线观看不卡| 日本人成精品视频在线| 欧美性xxxxxxxxx| 91九色单男在线观看| 色777狠狠综合秋免鲁丝| 欧美午夜视频一区二区| 国产精品国产自产拍高清av水多| 日韩欧美a级成人黄色| 精品久久久久久久中文字幕| 国产精品久久久久久av| 亚洲最大av网站| 欧美自拍大量在线观看| 亚洲人成网站999久久久综合| 久久久久久久成人| 日韩在线观看免费| 91精品国产综合久久香蕉的用户体验| 久久久久久久国产| 国产成人在线一区二区| 国产精品久久一区主播| 亚洲成人动漫在线播放| 亚洲欧美日韩中文在线| 国产一区在线播放| 日韩美女视频免费在线观看| 久久青草福利网站| 在线电影中文日韩| 91夜夜未满十八勿入爽爽影院| 成人高清视频观看www| 日韩毛片中文字幕| 国产亚洲成精品久久| 精品偷拍一区二区三区在线看| 日韩在线精品视频| 欧美亚洲成人xxx| 国产一区二区成人| 亚洲xxxx妇黄裸体| 韩国一区二区电影| 2019av中文字幕| 国产精品夜间视频香蕉| 久久这里有精品| 久久影视电视剧凤归四时歌| 国产精品亚洲自拍| 成人精品视频99在线观看免费| 国产精品高清在线| 操日韩av在线电影| 日韩免费av一区二区| 欧美野外猛男的大粗鳮| 精品国产户外野外| 国产视频在线一区二区| 欧美精品少妇videofree| 91av视频在线| 国产亚洲aⅴaaaaaa毛片| 欧美激情视频三区| 91在线色戒在线| 欧美激情精品久久久久久大尺度| 欧美成人精品激情在线观看| 国产精品一久久香蕉国产线看观看| 国产精品27p| 久久久精品久久久久| 91黑丝高跟在线| 日韩av网址在线观看| 久久久噜噜噜久久中文字免| 久久久之久亚州精品露出| 日韩国产一区三区| 欧美一区视频在线| 97视频在线观看免费高清完整版在线观看| 国语自产精品视频在免费| 日本精品视频网站| 91极品视频在线| 69久久夜色精品国产7777| 亚洲一区中文字幕| 亚洲2020天天堂在线观看| 97成人精品视频在线观看| 成人www视频在线观看| 国产精品96久久久久久又黄又硬| 国产精品高清免费在线观看| 亚洲精品电影在线| 久久噜噜噜精品国产亚洲综合| 亚洲国产日韩欧美在线99| 国产一区香蕉久久| 91在线高清视频| 国产脚交av在线一区二区| 久久欧美在线电影| 国产一区视频在线| 日韩中文在线视频| 韩国精品久久久999| 92福利视频午夜1000合集在线观看| 日韩av电影院| 国产精品嫩草影院久久久| 国产精品入口日韩视频大尺度| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久成人精品视频| 久久精品视频亚洲| 欧美资源在线观看| 日韩视频免费观看| 亚洲精品电影网| 高清在线视频日韩欧美| 国产91在线视频| 国产福利精品在线| 国产成人精品一区二区| 亚洲a区在线视频| 69国产精品成人在线播放| 欧美尤物巨大精品爽| 中文字幕9999| 成人av.网址在线网站| 亚洲日韩欧美视频一区| 在线播放国产一区二区三区| 国产热re99久久6国产精品| 欧美激情网站在线观看| 精品无人国产偷自产在线| 81精品国产乱码久久久久久| 日韩精品免费在线视频观看| 久久久久久久香蕉网| 疯狂做受xxxx高潮欧美日本| 国产精品男人的天堂|