go語(yǔ)言定時(shí)器教學(xué) go語(yǔ)言定時(shí)任務(wù)
Go語(yǔ)言基于Etcd實(shí)現(xiàn)的定時(shí)任務(wù)
利用 Etcd 的Lease租約特性來(lái)實(shí)現(xiàn)定時(shí)功能,同時(shí)通過(guò)Watch機(jī)制來(lái)實(shí)現(xiàn)多節(jié)點(diǎn)情況下只有一個(gè)節(jié)點(diǎn)執(zhí)行該任務(wù)。通過(guò)定時(shí)任務(wù)庫(kù) Cron 的時(shí)間字符串解析器Parser來(lái)解析任務(wù)執(zhí)行時(shí)間。
Etcd
Cron
源碼鏈接
golang 定時(shí)器,啟動(dòng)的時(shí)候執(zhí)行一次,以后每天晚上12點(diǎn)執(zhí)行,怎么實(shí)現(xiàn)
????func?startTimer(f?func())?{
????????go?func()?{
????????????for?{
????????????????f()
????????????????now?:=?time.Now()
????????????????//?計(jì)算下一個(gè)零點(diǎn)
????????????????next?:=?now.Add(time.Hour?*?24)
????????????????next?=?time.Date(next.Year(),?next.Month(),?next.Day(),?0,?0,?0,?0,?next.Location())
????????????????t?:=?time.NewTimer(next.Sub(now))
????????????????-t.C
????????????}
????????}()
????}
Golang-基于TimeingWheel定時(shí)器
在linux下實(shí)現(xiàn)定時(shí)器主要有如下方式
在這當(dāng)中 基于時(shí)間輪方式實(shí)現(xiàn)的定時(shí)器 時(shí)間復(fù)雜度最小,效率最高,然而我們可以通過(guò) 優(yōu)先隊(duì)列 實(shí)現(xiàn)時(shí)間輪定時(shí)器。
優(yōu)先隊(duì)列的實(shí)現(xiàn)可以使用最大堆和最小堆,因此在隊(duì)列中所有的數(shù)據(jù)都可以定義排序規(guī)則自動(dòng)排序。我們直接通過(guò)隊(duì)列中 pop 函數(shù)獲取數(shù)據(jù),就是我們按照自定義排序規(guī)則想要的數(shù)據(jù)。
在 Golang 中實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列異常簡(jiǎn)單,在 container/head 包中已經(jīng)幫我們封裝了,實(shí)現(xiàn)的細(xì)節(jié),我們只需要實(shí)現(xiàn)特定的接口就可以。
下面是官方提供的例子
因?yàn)閮?yōu)先隊(duì)列底層數(shù)據(jù)結(jié)構(gòu)是由二叉樹(shù)構(gòu)建的,所以我們可以通過(guò)數(shù)組來(lái)保存二叉樹(shù)上的每一個(gè)節(jié)點(diǎn)。
改數(shù)組需要實(shí)現(xiàn) Go 預(yù)先定義的接口 Len , Less , Swap , Push , Pop 和 update 。
timerType結(jié)構(gòu)是定時(shí)任務(wù)抽象結(jié)構(gòu)
首先的 start 函數(shù),當(dāng)創(chuàng)建一個(gè) TimeingWheel 時(shí),通過(guò)一個(gè) goroutine 來(lái)執(zhí)行 start ,在start中for循環(huán)和select來(lái)監(jiān)控不同的channel的狀態(tài)
通過(guò)for循環(huán)從隊(duì)列中取數(shù)據(jù),直到該隊(duì)列為空或者是遇見(jiàn)第一個(gè)當(dāng)前時(shí)間比任務(wù)開(kāi)始時(shí)間大的任務(wù), append 到 expired 中。因?yàn)閮?yōu)先隊(duì)列中是根據(jù) expiration 來(lái)排序的,
所以當(dāng)取到第一個(gè)定時(shí)任務(wù)未到的任務(wù)時(shí),表示該定時(shí)任務(wù)以后的任務(wù)都未到時(shí)間。
當(dāng) getExpired 函數(shù)取出隊(duì)列中要執(zhí)行的任務(wù)時(shí),當(dāng)有的定時(shí)任務(wù)需要不斷執(zhí)行,所以就需要判斷是否該定時(shí)任務(wù)需要重新放回優(yōu)先隊(duì)列中。 isRepeat 是通過(guò)判斷任務(wù)中 interval 是否大于 0 判斷,
如果大于0 則,表示永久就生效。
防止外部濫用,阻塞定時(shí)器協(xié)程,框架又一次封裝了timer這個(gè)包,名為 timer_wapper 這個(gè)包,它提供了兩種調(diào)用方式。
參數(shù)和上面的參數(shù)一樣,只是在第三個(gè)參數(shù)中使用了任務(wù)池,將定時(shí)任務(wù)放入了任務(wù)池中。定時(shí)任務(wù)的本身執(zhí)行就是一個(gè) put 操作。
至于put以后,那就是 workers 這個(gè)包管理的了。在 worker 包中, 也就是維護(hù)了一個(gè)任務(wù)池,任務(wù)池中的任務(wù)會(huì)有序的執(zhí)行,方便管理。
上一篇:沒(méi)有了
欄 目:GO語(yǔ)言
下一篇:go語(yǔ)言主要應(yīng)用 go語(yǔ)言主要應(yīng)用在哪些領(lǐng)域
本文標(biāo)題:go語(yǔ)言定時(shí)器教學(xué) go語(yǔ)言定時(shí)任務(wù)
本文地址:http://www.jygsgssxh.com/a1/wangluobiancheng/GOyuyan/17069.html
您可能感興趣的文章
- 04-02go語(yǔ)言web掃描器 go語(yǔ)言scanf
 - 04-02go語(yǔ)言免費(fèi)嗎 go語(yǔ)言 app
 - 04-02go語(yǔ)言網(wǎng)頁(yè)自動(dòng)化 go語(yǔ)言自動(dòng)化測(cè)試
 - 04-02華為用不用go語(yǔ)言 華為用什么編程語(yǔ)言
 - 04-02go語(yǔ)言好用的庫(kù) go語(yǔ)言用什么軟件
 - 04-02csgo如何切換語(yǔ)言 csgo切換語(yǔ)言指令
 - 04-02go語(yǔ)言視頻怎么獲取 go語(yǔ)言視頻教程
 - 04-02go語(yǔ)言性能和java go語(yǔ)言會(huì)替代java嗎
 - 04-02go語(yǔ)言主要應(yīng)用 go語(yǔ)言主要應(yīng)用在哪些領(lǐng)域
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02go語(yǔ)言web掃描器 go語(yǔ)言scanf
 - 04-02go語(yǔ)言免費(fèi)嗎 go語(yǔ)言 app
 - 04-02go語(yǔ)言網(wǎng)頁(yè)自動(dòng)化 go語(yǔ)言自動(dòng)化測(cè)試
 - 04-02華為用不用go語(yǔ)言 華為用什么編程語(yǔ)
 - 04-02go語(yǔ)言好用的庫(kù) go語(yǔ)言用什么軟件
 - 04-02csgo如何切換語(yǔ)言 csgo切換語(yǔ)言指令
 - 04-02go語(yǔ)言視頻怎么獲取 go語(yǔ)言視頻教程
 - 04-02go語(yǔ)言性能和java go語(yǔ)言會(huì)替代java嗎
 - 04-02go語(yǔ)言主要應(yīng)用 go語(yǔ)言主要應(yīng)用在哪些
 - 04-02go語(yǔ)言定時(shí)器教學(xué) go語(yǔ)言定時(shí)任務(wù)
 
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 04-02jquery與jsp,用jquery
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-10delphi制作wav文件的方法
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 


