Task进程中使用tick,如果clear了,无法再次tick,这是正常的吗?

在task进程中启动了tick,后来又进行了clearTimer。之后还想再次启动一个tick,结果tick的函数无法执行了。使用的是1.8.10编译的。

示例代码如下:

<?php
/**
 * 测试clearTimer
 * 
 * @param
 * @return
 */
$serv = new swoole_server("127.0.0.1", 10008, SWOOLE_BASE, SWOOLE_SOCK_TCP);
$serv->set(array('worker_num' => 1, 'task_worker_num' => 1, 'daemonize' => false));
$serv->on('connect', function($serv, $fd){   
    echo "Client: Connect.\n"; 
});
$serv->on('receive', function($serv, $fd, $from_id, $data){
    $cmd = trim($data);
    $serv->task($cmd);
});
$serv->on('close', function($serv, $fd){ 
    echo "Client: Close.\n"; 
});
$serv->on('WorkerStart', function($serv, $worker_id){
    $serv->cronjob = array();
});
$serv->on('Task', function($serv, $task_id, $from_id, $data=NULL){
    var_dump($data);
    if($data=='stop'){
        if(!empty($serv->cronjob['test'])){
            $serv->clearTimer($serv->cronjob['test']);
        }
    }elseif($data=='another'){
        $tmp = $serv->tick(1511, function($id){
            $now = microtime(true);
            echo "1511|{$id}|now:{$now}\n";
        });
        echo "another tick: {$tmp}\n"; 
    }elseif($data=='start'){
        $serv->cronjob['test'] = $serv->tick(500, function($id){
            $now = microtime(true);
            echo "500|{$id}|now:{$now}\n";
        });
        echo "starting tick: {$serv->cronjob['test']}\n";//id有了,但是并无实际执行的对象
    }else{
        var_dump($data);
    }
    return true;
});
$serv->on('Finish', function($serv, $data){
});


$serv->start();

执行时结果如下:


Client: Connect.

string(5) "start"
starting tick: 1
500|1|now:1474189724.7422
500|1|now:1474189725.2424
500|1|now:1474189725.7424
(这是tick在正常执行)

string(4) "stop"
(停止tick,执行了clearTimer)

string(5) "start"
starting tick: 2
(并无tick实际执行,无输出)

string(7) "another"
another tick: 3
(并无tick实际执行,无输出)

string(4) "stop"


string(5) "start"
starting tick: 4
(并无tick实际执行,无输出)
2016-09-18 17:18
0
0

smoilbig

赞同来自:

我也碰到这个问题。偶尔tick没有执行闭包里面的代码。但有时候发现过了一段时间闭包里面的代码又被执行了。感觉tick被延时执行了。不知道是什么情况。

2017-11-14 13:37

要回复问题请先登录注册