成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

swoft中Crontab定時器的坑

CarterLi / 1879人閱讀

摘要:我們項目使用的是框架,所以我就想到用框架的定時器。,以及的結(jié)構(gòu)注在定時器這塊使用到兩個一個是用于存儲任務(wù)的實例。

這兩天老大給了個需求想把商城熱點數(shù)據(jù)同步到redis緩存。我們項目使用的是swoft框架,所以我就想到用框架的Crontab定時器。但是在測試的時候發(fā)現(xiàn)把Table的size設(shè)置為1024時(實際上設(shè)置為任何大小都一樣,貼上swoole的解釋)發(fā)現(xiàn)內(nèi)存溢出了

普及一下Table(來自swoole文檔):
Table底層是建立在共享內(nèi)存之上的HashTable數(shù)據(jù)結(jié)構(gòu)。$size最大行數(shù),決定了HashTable的總行數(shù)。由于Table是在共享內(nèi)存之上,所以無法動態(tài)擴容。這個$size必須在創(chuàng)建前設(shè)置好。
$size參數(shù)指定表格的最大行數(shù),如果$size不是為2的N次方,如1024、8192,65536等,底層會自動調(diào)整為接近的一個數(shù)字,如果小于1024則默認成1024,即1024是最小值

先把框架任務(wù)投遞流程走一下:

首先當框架啟動一秒后,啟動定時器每秒去更新執(zhí)行一次Task(任務(wù))。更新任務(wù)之前先去隊列內(nèi)存表中清理已完成的隊列數(shù)據(jù)(這點很重要)

然后獲取出所有的任務(wù)中的隊列(可以理解為獲取所有的Task類中的方法),以任務(wù)規(guī)則,以及taskClass,分鐘,時間戳這些數(shù)據(jù)以md5方式加密得到每個任務(wù)隊列的key值,保存在runTimeTable 中。(originTable,以及runTimeTable 的結(jié)構(gòu))

注:在定時器這塊使用到兩個Table 一個是originTable用于存儲任務(wù)的(Task)實例。另一個是runTimeTable 存儲任務(wù)隊列實例,通俗地說就是存需要執(zhí)行的任務(wù)實例

再看看任務(wù)執(zhí)行流程,任務(wù)的執(zhí)行就很簡單了

首先通過getExecTasks這個方法把所有滿足條件的隊列任務(wù)放在一個數(shù)組,然后通過遍歷數(shù)據(jù)把runStatus的值改為self::START

之后執(zhí)行所有runStatus的值為self::START的隊列任務(wù)

把執(zhí)行后的隊列任務(wù)的runStatus的值改為self::FINISH

最后把runStatus的值改為self::FINISH的剔除掉

重新梳理一下我們邏輯
當我們新建執(zhí)行一個任務(wù)的時候,系統(tǒng)每秒鐘都回去更新執(zhí)行一個每個任務(wù)中的隊列數(shù)。
代碼如下:

通過代碼我們能夠發(fā)現(xiàn)每一分鐘他都會往runTimeTable 中添加60個任務(wù)隊列
但是當我們getExecTasks獲取將要執(zhí)行的任務(wù)隊里的時候是根據(jù)當前的時候是否等于執(zhí)行時間而標志狀態(tài)的
那么現(xiàn)在就會出現(xiàn)一個問題。當前時間往任務(wù)隊里中添加數(shù)據(jù)的時候 他把前面執(zhí)行過的任務(wù)隊列再次添加進runTimeTable 中
舉個栗子:
假如我有個異步任務(wù)Sync,其中有個每秒執(zhí)行一次的方法cronTask,
現(xiàn)在時間是2019-03-22 10:01:20 現(xiàn)在往更新runTimeTable 的時候 他會往里面添加60的任務(wù)隊列key分別會是
MD5(" "."Sync"."cronTask"."01"."00")
MD5(" "."Sync"."cronTask"."01"."01")
MD5(" "."Sync"."cronTask"."01"."02")
MD5(" "."Sync"."cronTask"."01"."03")
MD5(" "."Sync"."cronTask"."01"."04")
...
MD5(" "."Sync"."cronTask"."01"."59")

當時間到下一秒(是2019-03-22 10:01:21)的時候后 依然會往更新runTimeTable數(shù)據(jù) key值為
MD5(" "."Sync"."cronTask"."01"."00")
MD5(" "."Sync"."cronTask"."01"."01")
MD5(" "."Sync"."cronTask"."01"."02")
MD5(" "."Sync"."cronTask"."01"."03")
MD5(" "."Sync"."cronTask"."01"."04")
...
MD5(" "."Sync"."cronTask"."01"."59")

那么我們可以很明確地看出來在2019-03-22 10:01:21秒前的數(shù)據(jù)都是沒用的了 。這些數(shù)據(jù)永遠不會被消費,也不會被刪除。因此一段時間后會出現(xiàn)內(nèi)存溢出的情況。
所以解決方法是在清理消費數(shù)據(jù)的時候把過期數(shù)據(jù)也同時清理
把cleanRunTimeTable中的

if ($value["runStatus"] === self::FINISH) {

改為

$currentTime = time();
if ($value["runStatus"] === self::FINISH || $value["sec"] < $currentTime) {

本文為本人學(xué)習(xí)過程記錄。如果有哪些地方描述不當望各位大佬指出。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31065.html

相關(guān)文章

  • Swoft 源碼剖析 - Swoole和Swoft的那些事(Task投遞/定時任務(wù)篇)

    摘要:作為定時任務(wù)的執(zhí)行者,通過每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當下需要執(zhí)行的任務(wù),通過投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來源:簡書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對原文進行了重新的排版。Swoft Github: https://github.com/swoft-clou.....

    vvpvvp 評論0 收藏0
  • Swoft 源碼解讀

    摘要:官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標里面的框架算是非常重的了這里的重先不具體到性能層面主要是框架的設(shè)計思想和框架集成的服務(wù)讓框架可以既可以快速解決很多問題又可以輕松擴展中的框架有在應(yīng)該無出其右了這次解讀的源碼 官網(wǎng): https://www.swoft.org/源碼解讀: http://naotu.baidu.com/file/8... 號外號外, 歡迎大...

    weij 評論0 收藏0
  • Swoole 在 Swoft 的應(yīng)用

    摘要:在中的應(yīng)用官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標上一篇源碼解讀反響還不錯不少同學(xué)推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰(zhàn)之旅服務(wù)器開發(fā)涉及到的相關(guān)技術(shù)領(lǐng)域的知識非常多不日積月累打好基礎(chǔ)是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應(yīng)用 swoft 官網(wǎng): https://www.sw...

    EscapedDog 評論0 收藏0
  • linux下使用crontab運行Python腳本的坑

    摘要:在使用腳本實現(xiàn)功能時發(fā)現(xiàn)并沒有定時運行在指令后面添加指令,發(fā)現(xiàn)如下報錯腳本單獨運行是正常的,但是已使用后運行異常,再一番后發(fā)現(xiàn),是不能正確加載的環(huán)境變量導(dǎo)致,需要做如下修改這里是列表文本直接執(zhí)行所在路徑,路徑可以使用指令來獲取,所以我的在使用Python腳本實現(xiàn)DDNS功能時發(fā)現(xiàn)并沒有定時運行在指令后面添加>/dev/null 2&>1指令,發(fā)現(xiàn)如下報錯00-18-01 Traceback ...

    Tecode 評論0 收藏0
  • Swoft| Swoft官網(wǎng)全站 HTTP2 實踐

    摘要:官網(wǎng)全站實踐正式來襲也迎來自己的一個里程碑數(shù)正式突破官網(wǎng)作為項目組服務(wù)開發(fā)者們的重要渠道也迎來了自己的一次重大更新重構(gòu)升級到全站實現(xiàn)本篇先介紹官網(wǎng)全站實踐先來一張官網(wǎng)效果圖鎮(zhèn)樓靜態(tài)資源由托管開啟業(yè)務(wù)代碼交由執(zhí)行設(shè)置使用協(xié)議要實現(xiàn)非常簡單 date: 2018-3-8 13:50:03title: Swoft| Swoft官網(wǎng)全站 HTTP2 實踐 Swoft1.0正式來襲, Swoft...

    stdying 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<