请教定时器Timer的问题

barley

问题是这样的:
我使用的是TP5.0框架使用workerman做定时任务,以下我先贴代码图

说明:
第一张图片是继承server类启动worker的,开始onmessage有逻辑,后来废弃了,现在是只做定时器的启动使用的,第三章图片是onworkerstart里调用的类方法中定时器最多的,具体如图三,这只是截图了一小部分,里面有大量的Timer

问题:
1.我的开发机子和服务器都是windows,onworkerstart中worker->id只有0,我是不是可以认为即使我上面的processes是20,其实还是1?
2.即使我new 了三个类,在三个类中都各自Timer::add了一些定时器,其实和在一个类里调用的是一样的,都是一条串行的现,如果某个定时器里有耗时任务,就线性执行;但是我却发现,随着时间的推移,定时器执行的时间间隔会越来越大,比如一开始我监视的两个任务间隔1秒,半天后可能到10几秒了(同样的逻辑,同样的数据),在定时器内我有数据库的操作和redis操作(大多数为队列操作,基本就是读队列数据,然后走逻辑,逻辑里有数据库操作),如果这种情况,是不是和redis有关系?可能的问题在哪里?
3.曾经尝试使用pthreads解决,无奈个人能力不过关,失败了,后看文档说异步任务可解决 如何实现异步任务根据上面的试了几次均失败了,请教下该怎么弄或是在框架内怎么使用,我想要的结果就是他们都异步执行,各不相扰

在此先行谢过各位,只要有点想法的,请多多赐教!

2798 1 0
1个回答

blogdaren

你前后两贴问题不是一样的吗? https://wenda.workerman.net/question/4805
(1)其实还是1,因为windows版的workerman都是单进程;
(2)单进程内业务都是串行执行的,所以那堆定时器都是串行执行的,具体原因看你已经写的很明显了,就是每个任务内有各种数据IO和其他业务逻辑,有些任务的执行时间肯定是超过了当前定时器的定时周期,超过了也得等,等上一个任务完了再来下一个;
(3)异步任务的代码手册里写的很详细了,不写了,大致思路就是:
A. 首先将add_timer()内的定时器逻辑分组归类;
B. 将定时器内的那堆方法 array(this, 'xxxx') 抽象成固定格式的数据包,形如:

$package = [
    'function'  => 'xxxx',
    'arguments' => [$arg1, $arg2, ...],
    .......
]

C. 将定时器内的那堆方法 array(this, 'xxxx') 原本要干的事情分离出来部署到独立的业务进程组或机器上来搞,这里主要是解析接收到的$package,然后执行对应的业务逻辑。
D. add_timer()方法内改造成将异步调用,即推送 $package 到业务进程组或机器。

  • barley 2020-02-20

    感谢回答,你说的那个是我回答了,并不是我提交的问题,非常感谢回答

年代过于久远,无法发表回答
🔝