吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單時間輪算法詳解

xCb1_yikoulinux ? 來源:稀土掘金技術社區 ? 作者:稀土掘金技術社區 ? 2022-08-22 11:45 ? 次閱讀

時間輪

時間輪算法是通過一個時間輪去維護定時任務,按照一定的時間單位對時間輪進行劃分刻度。然后根據任務延時計算任務落在該時間輪的第幾個刻度上,如果任務時長超出了刻度數量,則需要增加一個參數記錄時間輪需要轉動的圈數。

簡單時間輪

時間輪類似于我們的鐘表,當指針指到刻度上,我們就去執行對應的任務列表。例如,我們需要統計每個小時的登錄用戶數。

c513f47e-21c6-11ed-ba43-dac502259ad0.jpg

時間輪算法中,輪詢線程遍歷到某一個時間刻度后,總是執行對應刻度上任務隊列中的所有任務(通常是將任務扔給異步線程池來處理),而不再需要遍歷檢查所有任務的時間戳是否達到要求(不用每次從小頂堆堆頂,取數據來和時間比較,然后堆化這些操作)。

現在我們即使有n個任務,輪詢線程也沒有必要,每輪遍歷n次,我們只需要按照時間刻度來輪訓即可。

不過,小時作為時間單位粒度太大,我們有時候往往會希望基于分鐘、秒等作為時間刻度。最直接的方式是增加時間刻度,通過增加時間刻度,我們可以基于更精細的時間單位(分鐘)來進行定時任務的執行。但是,這種實現方式有如下的缺陷:

當我們刻度增多時,而任務相對較少,效率就會下降,假如我們只有以秒為刻度,一天 24 * 60 * 60 = 86400秒,我們可能只占用幾十或幾百個刻度,大部分時間刻度所占用的內存空間是沒有任何意義的。

round時間輪算法

我們發現,時間輪的時間刻度隨著時間精度而增加并不是一個好的問題解決思路?,F在,我們將時間輪的精度設置為秒,時間刻度個數固定為 60。每一個任務擁有一個 round 字段。

輪詢線程的執行邏輯是:每隔一秒處理一個時間刻度上任務隊列中的所有任務,任務的 round 字段減 1,接著判斷如果 round 字段的值變為 0,那么將任務移出任務隊列,交給異步線程池來執行對應任務。如果是重復執行任務,那么再將任務添加到任務隊列中。

輪詢線程遍歷一次時間輪需要 60 秒。如果一個任務需要間隔 x 秒執行一次,那么其 round 字段的值為 x/60(整除),任務位于第 (x%60)(取余)個刻度對應的任務隊列中。例如任務需要間隔 130 秒執行一次,那么 round 字段的值為 2,此任務位于第 10 號時間刻度的任務隊列中。

c529e996-21c6-11ed-ba43-dac502259ad0.jpg

這種方式雖然簡化了時間輪的刻度個數,但是并沒有減少輪詢次數,效率還是相對較低。時間輪每次處理一個時間刻度,就需要處理其上任務隊列的所有任務。其運行效率甚至與基于普通任務隊列實現的定時任務框架沒有區別。

分層時間輪

分層的時間輪算法在生活中有對應的模型,那就是水表:

c52f8810-21c6-11ed-ba43-dac502259ad0.jpg

我們可以將一天類似水表一樣,分為多個輪,時、分和秒三個級別的時間輪,每一個輪的刻度分別為24、60、60個刻度。分層時間輪如下:

c5399ae4-21c6-11ed-ba43-dac502259ad0.jpg

假設我們有2個任務是每天的100執行一次,任務首先添加到時輪第1刻度上,當時輪到達第1刻度時,任務轉移到分輪上的第0刻度,當分輪達到第0刻度,任務轉移到秒輪,當秒輪達到第0刻度,任務一次執行。

優點:

輪詢效率變高:不需要計算round值,其次任務隊列中的任務一旦被遍歷,就是需要被處理的(沒有空輪詢問題);

線程并發好:雖然引入了并發線程,但是線程數僅僅和時鐘輪的級數有關,并不會隨著任務的增長而變多

分層時間輪的任務從一個時間輪轉移到另一個時間輪,有點像水表中小單位的表轉一圈進位到大單位一樣(但是分層時間輪是從大到小,因為從小到大的話,小單位的表輪詢判斷次數過多)

應用:

時間輪的使用在各大框架與中間件中有使用,xxl-job,netty都對時間輪都自己的實現。思路基本上與分層的時間輪策略一致。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4630

    瀏覽量

    93355
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115371
收藏 人收藏

    評論

    相關推薦

    SVPWM的原理推導和控制算法詳解

    SVPWM的原理推導和控制算法詳解,不錯的資料,值得一看
    發表于 01-28 15:09

    詳解快速傅里葉變換FFT算法

    本帖最后由 richthoffen 于 2019-7-19 16:41 編輯 詳解快速傅里葉變換FFT算法
    發表于 07-18 08:07

    詳解快速傅里葉變換FFT算法

    詳解快速傅里葉變換FFT算法
    發表于 03-28 11:48

    算法篇(PID詳解)

    算法篇(PID詳解)
    發表于 05-19 10:30

    詳解快速傅里葉變換FFT算法

    詳解快速傅里葉變換FFT算法
    發表于 05-25 09:31

    時間的種類有哪些?

    什么是單層時間?什么是多層時間?
    發表于 11-06 06:15

    詳解快速傅里葉變換FFT算法

    詳解快速傅里葉變換FFT算法
    發表于 03-05 11:07

    路由算法詳解

    路由算法詳解1. 引言 2. 路由器基礎知識 3. LS算法 4. 示例:Dijkstra算法 5. DV算法 6. 分級路由
    發表于 08-06 09:36 ?5524次閱讀
    路由<b class='flag-5'>算法</b><b class='flag-5'>詳解</b>

    SVPWM的原理及法則推導和控制算法詳解

    SVPWM的原理及法則推導和控制算法詳解
    發表于 04-13 15:42 ?18次下載

    SVPWM的原理及法則推導和控制算法詳解

    空間矢量控制原理及法則推導和控制算法詳解
    發表于 05-09 10:59 ?1次下載

    PID算法詳解

    PID算法詳解
    發表于 12-17 20:48 ?12次下載

    [目標檢測]Faster RCNN算法詳解

    %;復雜網絡達到5fps,準確率78.8%。 作者在github上給出了基于matlab和python的源碼。對Region CNN算法不了解的同學,請先參看前兩篇文章: 《RCNN算法詳解
    發表于 12-06 02:30 ?765次閱讀

    [源代碼]Python算法詳解

    [源代碼]Python算法詳解[源代碼]Python算法詳解
    發表于 06-06 17:50 ?0次下載

    多級時間實現框架

    一. 多級時間實現框架 上圖是5個時間級聯的效果圖。中間的大是工作,只有在它上的任務才會
    的頭像 發表于 06-22 14:57 ?738次閱讀
    多級<b class='flag-5'>時間</b><b class='flag-5'>輪</b>實現框架

    多級時間實現框架

    一. 多級時間實現框架 上圖是5個時間級聯的效果圖。中間的大是工作,只有在它上的任務才會
    的頭像 發表于 11-11 15:49 ?755次閱讀
    多級<b class='flag-5'>時間</b><b class='flag-5'>輪</b>實現框架
    百家乐看大小路| 百家乐官网庄闲最佳打法| 足球百家乐系统| 玩百家乐保时捷娱乐城| 防伪百家乐官网筹码币套装| 百家乐官网最新道具| 半圆百家乐官网桌子| 百家乐官网真人娱乐场| 百家乐官网赢得秘诀| 商洛市| 吉安市| 大发888娱乐城官方下载安装| 大发888大发体育| 大发888娱乐场下载最高| 大发888有赢钱的吗| 大发888娱乐场客户端| 大发888赢钱最多的| 六合彩官方网| 菲律宾太子娱乐城| 百家乐官网下注平台| 在线百家乐官网代理| 88百家乐官网现金网| 任我赢百家乐官网自动投注系统| 百家乐官网小音箱| 百家乐官网在线娱乐场| 百家乐官网赌博凯时娱乐| 百家乐官网顺序| 百家乐官网怎么稳赢| 百家乐官网的玩法技巧和规则| 网上百家乐官网公| 波音百家乐现金网| 喜来登百家乐官网的玩法技巧和规则| 北京百家乐官网网上投注| 百家乐官网的玩法技巧和规则| 百家乐是否有路子| 百家乐深圳广告| 威尼斯人娱乐城备用地址| 德州扑克比赛| 百家乐官网数据程序| 百家乐官网打水论坛| 海立方百家乐客户端|