亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

swoft中Crontab定時(shí)器的坑

CarterLi / 1919人閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

當(dāng)時(shí)間到下一秒(是2019-03-22 10:01:21)的時(shí)候后 依然會(huì)往更新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")

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

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

改為

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31065.html

相關(guān)文章

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

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

    vvpvvp 評(píng)論0 收藏0
  • Swoft 源碼解讀

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

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

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

    EscapedDog 評(píng)論0 收藏0
  • linux下使用crontab運(yùn)行Python腳本的坑

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

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

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

    stdying 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<