子进程下多个timer怎么互不影响

CaiTQ

当我第一个timer堵住了,其它timer则会被影响,这个时候我要怎么去弄才能让这些timer互不影响呢,新人刚接触,求大佬救命!代码如下:

$worker = new Worker();
$worker->count = 1;
$worker->onWorkerStart = function($worker)
{
        $time_id = Timer::add(1, function()  use (&$time_id){
            $date = date('Y-m-d H:i:s',time());
            $html = file_get_contents('https://github.com');
            echo "-$time_id --- $date\n";
        });
        $time_id1 = Timer::add(2, function()use (&$time_id1){
            $date = date('Y-m-d H:i:s',time());
            echo "-$time_id1 ---- $date\n";
        });
        $time_id2 = Timer::add(3, function()use (&$time_id2){
            $date = date('Y-m-d H:i:s',time());
            echo "-$time_id2 ---- $date\n";
        });

};
// 运行worker
Worker::runAll();
2987 2 0
2个回答

workerofmine
$closeInterval = 10;
$closeTime = time();
$con -> conClose = Timer ::add($closeInterval,function() use ($con,$closeTime){
    $con -> close();
});

按照官方的手册,这样写三个试试。

  • CaiTQ 2017-11-20

    还是挺懵的,官网那边我现在还在熟悉,第一天接触,不是很理解

  • workerofmine 2017-11-20

    @3075:就按照刚我上面说的,连续写三个应该没问题,我这边就是这样写的,windows环境。

  • CaiTQ 2017-11-20

    我是用多个worker去写的,定时器好像不能多个timer一起使用,一起使用一个阻塞会影响其他的timer

latin

手册说的

定时器使用注意事项
1、只能在onXXXX回调中添加定时器。全局的定时器推荐在onWorkerStart回调中设置,针对某个连接的定时器推荐在onConnect中设置。
2、添加的定时任务在当前进程执行(不会启动新的进程或者线程),如果任务很重(特别是涉及到网络IO的任务),可能会导致该进程阻塞,暂时无法处理其它业务。所以最好将耗时的任务放到单独的进程运行,例如建立一个/多个Worker进程运行

3、当前进程忙于其它业务时或者当一个任务没有在预期的时间运行完,这时又到了下一个运行周期,则会等待当前任务完成才会运行,这会导致定时器没有按照预期时间间隔运行。也就是说当前进程的业务都是串行执行的,如果是多进程则进程间的任务运行是并行的。

一个进程里的定时器如果运行超时会延迟这个进程的其它定时器运行的,我觉得你可以把不通的定时器放在不通的进程去运行就好了

  • CaiTQ 2017-11-20

    我也是刚注意到手册上有写这个,谢谢了

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