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

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

3天內不再提示

定時器實現(xiàn)原理——時間輪

xCb1_yikoulinux ? 來源:一口Linux ? 作者:一口Linux ? 2022-08-22 11:47 ? 次閱讀

時間輪

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

簡單時間輪

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

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

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

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

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

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

round時間輪算法

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

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

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

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

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

分層時間輪

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

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

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

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

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

優(yōu)點:

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

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

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

應用:

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

審核編輯 :李倩

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

    關注

    23

    文章

    4588

    瀏覽量

    92505
  • 定時器
    +關注

    關注

    23

    文章

    3232

    瀏覽量

    114329

原文標題:定時器實現(xiàn)原理——時間輪

文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    門頭燈定時器怎么調開關時間

    在現(xiàn)代商業(yè)環(huán)境中,門頭燈不僅是企業(yè)形象的一部分,也是吸引顧客的重要手段。然而,手動控制門頭燈的開關往往既耗時又容易出錯。為了解決這一問題,門頭燈定時器應運而生,它通過預設的時間表自動控制門頭燈的開關
    的頭像 發(fā)表于 10-17 14:14 ?369次閱讀

    定時器的工作方式介紹

    定時器是計算機和嵌入式系統(tǒng)中常見的一種硬件模塊,用于實現(xiàn)定時和計數(shù)功能。定時器的工作方式通常由一組寄存來控制,這些寄存
    的頭像 發(fā)表于 07-12 10:29 ?654次閱讀

    定時器相關的寄存有哪些類型

    在微控制編程中,定時器是一種非常常見的功能模塊,用于實現(xiàn)各種定時和計數(shù)功能。定時器的工作原理是通過內部的計數(shù)
    的頭像 發(fā)表于 07-12 10:25 ?679次閱讀

    長持續(xù)時間定時器電路圖 時間定時器的工作原理和功能

    的處理,都離不開定時器的精確控制。時間定時器通常由硬件和軟件兩部分組成,硬件部分通過計時芯片或計數(shù)
    的頭像 發(fā)表于 06-24 17:34 ?1395次閱讀
    長持續(xù)<b class='flag-5'>時間</b><b class='flag-5'>定時器</b>電路圖 <b class='flag-5'>時間</b><b class='flag-5'>定時器</b>的工作原理和功能

    時間繼電器與定時器的區(qū)別

    在工業(yè)自動化和電子設備控制領域,時間繼電器和定時器是兩種常見的控制元件。它們都能夠實現(xiàn)電路的時間控制功能,但在設計原理、應用場景、控制精度等方面存在顯著的差異。本文將對
    的頭像 發(fā)表于 06-21 18:18 ?929次閱讀

    三菱PLC編程實現(xiàn)讀出時間定時器

    的功能,而定時器實現(xiàn)時間控制的關鍵組件。本文將詳細介紹如何使用三菱PLC編程實現(xiàn)讀出時間定時器。 1.
    的頭像 發(fā)表于 06-20 11:11 ?1980次閱讀

    三菱plc如何顯示定時器時間

    菱PLC中,定時器的顯示和設置是非常重要的,下面將詳細介紹如何顯示和設置三菱PLC的定時器時間。 一、定時器的基本概念 定時器的作用:
    的頭像 發(fā)表于 06-20 11:10 ?1619次閱讀

    如何實現(xiàn)一個軟件定時器?

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時器,原理大同小異。典型的實現(xiàn)方法是:通過一個硬件定時器產生固定的時鐘節(jié)拍,每次硬件定時器中斷到,就對一個全局的
    的頭像 發(fā)表于 04-29 11:00 ?568次閱讀

    ?PLC定時器介紹

    定時器是PLC中重要的編程元件,是累計時間增量的內部器件。大部分自動控制領域都需要定時器進行延時控制,靈活地使用定時器可以編制出復雜的控制程序。
    發(fā)表于 03-22 12:36 ?2075次閱讀
    ?PLC<b class='flag-5'>定時器</b>介紹

    使用555定時器的可調雙定時器電路

    等。使用555定時器IC的可調雙定時器電路項目也是555定時器IC的應用之一。通過使用這個項目,人們可以一個接一個地切換兩個不同的設備,以調整時間(1分鐘到 10 分鐘)。
    的頭像 發(fā)表于 02-25 15:16 ?1947次閱讀
    使用555<b class='flag-5'>定時器</b>的可調雙<b class='flag-5'>定時器</b>電路

    定時器原理能控制馬達嗎為什么

    定時器原理可以用于控制馬達。馬達是一種將電能轉換為機械能的設備,通常由電動機和傳動裝置組成。定時器是一種電子設備,用來生成和計時精確而穩(wěn)定的時間信號。通過將定時器與馬達控制電路相連,可
    的頭像 發(fā)表于 01-23 15:21 ?583次閱讀

    時間定時器開關怎樣設置時間

    時間定時器是一種常見的設備,用于按照設定的時間自動開關電器或進行其他指定操作。通過設定定時器的開關時間,我們可以讓電器在特定的
    的頭像 發(fā)表于 01-16 16:32 ?4242次閱讀

    定時器會阻塞線程嗎 定時器指令有哪幾種

    定時器會阻塞線程嗎 定時器指令有哪幾種? 定時器一般不會阻塞線程,但具體是否會阻塞取決于所使用的定時器實現(xiàn)方式和使用方式。
    的頭像 發(fā)表于 12-19 14:03 ?866次閱讀

    STM32定時器時間計算方法

    STM32微控制定時器模塊在嵌入式系統(tǒng)中非常常見,它被用于產生精確的時間延遲,或者用于實時時鐘(RTC)等功能。為了充分利用STM32的定時器功能,理解其
    的頭像 發(fā)表于 12-19 11:31 ?1.1w次閱讀

    間歇定時器怎么使用?定時器時間間隔程序淺析

    間歇定時器的作用是重復執(zhí)行一個函數(shù),且不會阻塞主線程。這種類型的定時器常用于間隔性地自動執(zhí)行代碼,例如網頁中的倒計時。
    的頭像 發(fā)表于 12-14 15:16 ?1263次閱讀