onTask

在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务。当前的Task进程在调用onTask回调函数时会将进程状态切换为忙碌,这时将不再接收新的Task,当onTask函数返回时会将进程状态切换为空闲然后继续接收新的Task。

function onTask(swoole_server $serv, int $task_id, int $src_worker_id, mixed $data);
  • $task_id是任务ID,由swoole扩展内自动生成,用于区分不同的任务。$task_id和$src_worker_id组合起来才是全局唯一的,不同的worker进程投递的任务ID可能会有相同
  • $src_worker_id来自于哪个worker进程
  • $data 是任务的内容

onTask函数执行时遇到致命错误退出,或者被外部进程强制kill,当前的任务会被丢弃,但不会影响其他正在排队的Task

V4.2.12起如果开启了 task_enable_coroutine 则回调函数原型是

$server->on('Task', function ($serv, Swoole\Server\Task $task) {
    //来自哪个`Worker`进程
    $task->worker_id;
    //任务的编号
    $task->id;
    //任务的类型,taskwait, task, taskCo, taskWaitMulti 可能使用不同的 flags
    $task->flags;
    //任务的数据
    $task->data;
    //协程 API
    co::sleep(0.2);
    //完成任务,结束并返回数据
    $task->finish([123, 'hello']);
});

返回执行结果到worker进程

1.7.2以上的版本,在onTask函数中 return字符串,表示将此内容返回给worker进程。worker进程中会触发onFinish函数,表示投递的task已完成,当然你也可以通过swoole_server->finish()来触发onFinish函数,而无需再return

  • return的变量可以是任意非null的PHP变量

1.7.2以前的版本,需要调用swoole_server->finish()函数将结果返回给worker进程



  • 我在这里调 $serv->connection_list() 一直返回false,请问什么原因啊?任务通过 $serv->task('xx') 产生

  • 无枪草民

    onTask里有没有方法再给自已发一个新任务。让自已可以继续跑一次?

  • 放开那袋爆米花

    onTask 下执行 push报错 找不到客户端 是什么意思?

  • Sonder

    nice

  • 高级开发架构师

    支持这个协程定时器