武英斌-博客

Swool 异步任务

发布时间:7年前热度: 498 ℃评论数:

在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。

Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。

基于第一个TCP服务器,只需要增加onTaskonFinish2个事件回调函数即可。另外需要设置task进程数量,可以根据任务的耗时和任务量配置适量的task进程。

示例代码:

set(array('task_worker_num' => 4));

$serv->on('receive', function($serv, $fd, $from_id, $data) {
    //投递异步任务
    $task_id = $serv->task($data);
    echo "接受到任务:id=$task_id\n";
});

//处理异步任务
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
    echo "处理异步任务[id=$task_id]".PHP_EOL;
    //返回任务执行的结果
    $serv->finish("$data -> OK");
});

//处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
    echo "返回异步任务处理结果[$task_id] Finish: $data".PHP_EOL;
});
//调用$serv->task()后,程序立即返回,继续向下执行代码。onTask回调函数Task进程池内被异步执行。
//执行完成后调用$serv->finish()返回结果。
//finish操作是可选的,也可以不返回任何结果
$serv->start();

执行TCP 监听

[root@iZwz9ceni0j572ailou314Z netcat-0.7.1]# telnet 127.0.0.1 9501 服务器响应

[root@iZwz9ceni0j572ailou314Z default]# php swool_task.php 接受到任务:id=0 处理异步任务[id=0] 返回异步任务处理结果[0] Finish: fa -> OK 接受到任务:id=1 处理异步任务[id=1] 返回异步任务处理结果[1] Finish: 234 -> OK 接受到任务:id=2 处理异步任务[id=2] 返回异步任务处理结果[2] Finish: sdf -> OK 接受到任务:id=3 处理异步任务[id=3] 返回异步任务处理结果[3] Finish: sdfsdf -> OK 接受到任务:id=4 处理异步任务[id=4] 返回异步任务处理结果[4] Finish: sdfsd -> OK 接受到任务:id=5 处理异步任务[id=5] 返回异步任务处理结果[5] Finish: fsdf -> OK 接受到任务:id=6 处理异步任务[id=6] 返回异步任务处理结果[6] Finish: sd -> OK 接受到任务:id=7 处理异步任务[id=7] 返回异步任务处理结果[7] Finish: f -> OK

Swool,异步任务

手机扫码访问