在 Server 程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web 服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。
Swoole 提供了异步任务处理的功能,可以投递一个异步任务到 TaskWorker 进程池中执行,不影响当前请求的处理速度。
<?php
$http = new Swoole\Http\Server('0.0.0.0', 9501);
//设置异步任务的工作进程数量
$http->set([
'task_worker_num' => 4
]);
////此回调函数在worker进程中执行
$http->on('Request', function ($request, $response) use($http) {
echo "来了!".PHP_EOL;
$response->header('Content-Type', 'text/html; charset=utf-8');
$http->task("广播任务");
$http->task("列队任务");
$http->task("邮件任务");
$response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});
//处理异步任务(此回调函数在task进程中执行)
$http->on('Task', function ($serv, $task_id, $reactor_id, $data) {
$sle = rand(1,5);
echo "New AsyncTask[id={$task_id}] sleep:{$sle}".PHP_EOL;
sleep($sle);
//返回任务执行的结果
$serv->finish("{$data} -> OK");
});
//处理异步任务的结果(此回调函数在worker进程中执行)
$http->on('Finish', function ($serv, $task_id, $data) {
echo "AsyncTask[{$task_id}] Finish: {$data}".PHP_EOL;
});
$http->start();
在终端中运行该php文件 php test.php
在浏览器访问 IP:9501
即可。
浏览器显示 <h1>Hello Swoole. #8511</h1>
终端显示:
当 任务数量 大于 异步任务的工作进程数量 时
在上面设置的 异步任务的工作进程数量 = 4,当执行的任务数量多于4时,是怎样的呢?
$http->on('Request', function ($request, $response) use($http) {
echo "来了!".PHP_EOL;
$response->header('Content-Type', 'text/html; charset=utf-8');
//6个任务
$http->task("广播任务");
$http->task("列队任务");
$http->task("邮件任务");
$http->task("广播任务2");
$http->task("列队任务2");
$http->task("邮件任务2");
$response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});
执行结果
评论 (0)