問(wèn)題是這樣的:
我使用的是TP5.0框架使用workerman做定時(shí)任務(wù),以下我先貼代碼圖
說(shuō)明:
第一張圖片是繼承server類(lèi)啟動(dòng)worker的,開(kāi)始o(jì)nmessage有邏輯,后來(lái)廢棄了,現(xiàn)在是只做定時(shí)器的啟動(dòng)使用的,第三章圖片是onworkerstart里調(diào)用的類(lèi)方法中定時(shí)器最多的,具體如圖三,這只是截圖了一小部分,里面有大量的Timer
問(wèn)題:
1.我的開(kāi)發(fā)機(jī)子和服務(wù)器都是windows,onworkerstart中worker->id只有0,我是不是可以認(rèn)為即使我上面的processes是20,其實(shí)還是1?
2.即使我new 了三個(gè)類(lèi),在三個(gè)類(lèi)中都各自Timer::add了一些定時(shí)器,其實(shí)和在一個(gè)類(lèi)里調(diào)用的是一樣的,都是一條串行的現(xiàn),如果某個(gè)定時(shí)器里有耗時(shí)任務(wù),就線性執(zhí)行;但是我卻發(fā)現(xiàn),隨著時(shí)間的推移,定時(shí)器執(zhí)行的時(shí)間間隔會(huì)越來(lái)越大,比如一開(kāi)始我監(jiān)視的兩個(gè)任務(wù)間隔1秒,半天后可能到10幾秒了(同樣的邏輯,同樣的數(shù)據(jù)),在定時(shí)器內(nèi)我有數(shù)據(jù)庫(kù)的操作和redis操作(大多數(shù)為隊(duì)列操作,基本就是讀隊(duì)列數(shù)據(jù),然后走邏輯,邏輯里有數(shù)據(jù)庫(kù)操作),如果這種情況,是不是和redis有關(guān)系?可能的問(wèn)題在哪里?
3.曾經(jīng)嘗試使用pthreads解決,無(wú)奈個(gè)人能力不過(guò)關(guān),失敗了,后看文檔說(shuō)異步任務(wù)可解決 如何實(shí)現(xiàn)異步任務(wù)根據(jù)上面的試了幾次均失敗了,請(qǐng)教下該怎么弄或是在框架內(nèi)怎么使用,我想要的結(jié)果就是他們都異步執(zhí)行,各不相擾
在此先行謝過(guò)各位,只要有點(diǎn)想法的,請(qǐng)多多賜教!
你前后兩貼問(wèn)題不是一樣的嗎? https://wenda.workerman.net/question/4805
(1)其實(shí)還是1,因?yàn)閣indows版的workerman都是單進(jìn)程;
(2)單進(jìn)程內(nèi)業(yè)務(wù)都是串行執(zhí)行的,所以那堆定時(shí)器都是串行執(zhí)行的,具體原因看你已經(jīng)寫(xiě)的很明顯了,就是每個(gè)任務(wù)內(nèi)有各種數(shù)據(jù)IO和其他業(yè)務(wù)邏輯,有些任務(wù)的執(zhí)行時(shí)間肯定是超過(guò)了當(dāng)前定時(shí)器的定時(shí)周期,超過(guò)了也得等,等上一個(gè)任務(wù)完了再來(lái)下一個(gè);
(3)異步任務(wù)的代碼手冊(cè)里寫(xiě)的很詳細(xì)了,不寫(xiě)了,大致思路就是:
A. 首先將add_timer()內(nèi)的定時(shí)器邏輯分組歸類(lèi);
B. 將定時(shí)器內(nèi)的那堆方法 array(this, 'xxxx') 抽象成固定格式的數(shù)據(jù)包,形如:
$package = [
'function' => 'xxxx',
'arguments' => [$arg1, $arg2, ...],
.......
]
C. 將定時(shí)器內(nèi)的那堆方法 array(this, 'xxxx') 原本要干的事情分離出來(lái)部署到獨(dú)立的業(yè)務(wù)進(jìn)程組或機(jī)器上來(lái)搞,這里主要是解析接收到的$package,然后執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯。
D. add_timer()方法內(nèi)改造成將異步調(diào)用,即推送 $package 到業(yè)務(wù)進(jìn)程組或機(jī)器。