代码改变世界

Swoole 中使用异步任务

2020-07-01 16:11  小伍2013  阅读(697)  评论(0编辑  收藏  举报

执行异步任务 (Task)

# server.php

$serv = new Swoole\Server("127.0.0.1", 9501); 

// 设置异步任务的工作进程数量
$serv->set(array('task_worker_num' => 4));

$serv->on('Connect', function ($serv, $fd) {
    echo "Client: Connect.\n";
});

// 此回调函数在worker进程中执行
$serv->on('Receive', function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, "Server: ".$data);
    // 向 task_worker 进程投递异步任务,程序继续向下执行代码
    $task_id = $serv->task($data);
    echo "Dispatch AsyncTask: id=$task_id\n";
});

$serv->on('Close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

// 处理异步任务(此回调函数在task进程中执行)
// 会将当前进程状态切换为忙碌,不再接收任务;执行完成后切换为空闲,继续接收任务
$serv->on('Task', function ($serv, $task_id, $from_id, $data) {
    echo "New AsyncTask[id=$task_id]".PHP_EOL;
    // 返回任务执行的结果
    $serv->finish("$data -> OK");
});

// 处理异步任务的结果(此回调函数在worker进程中执行)
$serv->on('Finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});

$serv->start();