Swoole提供了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中执行,不影响当前请求的处理速度。
在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。
1.代码讲解
1.创建TCP服务器:$serv = new swoole_server(“0.0.0.0”, 9501);
2.设置异步任务的工作进程数1
$serv->set(array('task_worker_num' => 4));
3.onReceive事件,用来投递异步任务,同时获取此次异步任务的ID1
2
3
4
5//投递异步任务
$serv->on('receive', function($serv, $fd, $from_id, $data) {
//获取此次异步任务的ID
$task_id = $serv->task($data);
});
4.onTask事件,用来处理异步任务,同时返回任务执行的结果1
2
3
4$serv->on('task', function ($serv, $task_id, $from_id, $data) {
//返回任务执行的结果
$serv->finish("$data -> OK");
});
5.onFinish事件,用来处理异步任务的结果1
2
3
4//处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
});
6.启动服务器,$serv->start();
2.代码运行
上传脚本代码至服务器并运行,再开启一个终端可以看到已经有4个额外的worker进程在运行
我们把这个终端当作TCP客户端采用TCP方式连接服务器测试,并发送消息
此时在另一个终端即TCP服务器端可以看到如下