Task Worker进程

原创
2016/09/07 15:00
阅读数 53

简介

Task Worker是Swoole中一种特殊的工作进程,该进程的作用是处理一些耗时较长的任务,以达到释放Worker进程的目的。Worker进程可以通过swoole_server对象的task方法投递一个任务到Task Worker进程,其流程如下所示:


Worker->Task Worker: task()
Note right of Task Worker: onTask()
Task Worker-->Worker: finish()
Note left of Worker: onFinish()

'''sequence Title: Here is a title A->B: Normal line B-->C: Dashed line C->>D: Open arrow D-->>A: Dashed open arrow '''

Worker进程通过Unix Sock管道将数据发送给Task Worker,这样Worker进程就可以继续处理新的逻辑,无需等待耗时任务的执行。需要注意的是,由于Task Worker是独立进程,因此无法直接在两个进程之间共享全局变量,需要使用Redis、MySQL或者swoole_table来实现进程间共享数据。

实例

要使用Task Worker,需要进行一些必要的操作。

首先,需要设置swoole_server的配置参数:

$serv->set(array(
    'task_worker_num' => 2, // 设置启动2个task进程
));

接着,绑定必要的回调函数:

$serv->on('Task', 'onTask');
$serv->on('Finish','onFinish');

其中两个回调函数的原型如下所示:

/**
 * @param $serv swoole_server swoole_server对象
 * @param $task_id int 任务id
 * @param $from_id int 投递任务的worker_id
 * @param $data string 投递的数据
 */
function onTask(swoole_server $serv, $task_id, $from_id, $data);

/**
 * @param $serv swoole_server swoole_server对象
 * @param $task_id int 任务id
 * @param $data string 任务返回的数据
 */
function onFinish(swoole_server $serv, $task_id, $data);

在实际逻辑中,当需要发起一个任务请求时,可以使用如下方法调用:

$data = "task data";
$serv->task($data , -1 ); // -1代表不指定task进程

// 在1.8.6+的版本中,可以动态指定onFinish函数
$serv->task($data, -1, function (swoole_server $serv, $task_id, $data) {
    echo "Task Finish Callback\n";
});
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部