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