0

假如创建了一个swoole_http_server对象$server,并向其中注册了onFinish回调,当有多个taskworker处理逻辑并返回到onFinish中,我怎么去区别这个taskworker做了什么,并继续执行后面的逻辑?

  1. 我目前能想到的是在taskWorker返回的数据中添加标记

但是onFinish中的参数里面有taskID,我没有用到,总感觉哪里不对......

请问下你们在项目中是如果处理呢?谢谢!

sowork 187
2019-09-29 提问
1 个回答
0

已采纳

其实你已经说出正确答案了。调用task后,记录一下task_id和相关数据,然后在onFinish里取出数据,做相应处理。

1
<?php
class Test
{
    private $server;

    private $taskMap = [];

    public function run()
    {
        $this->server = new Swoole\Http\Server("127.0.0.1", 9501);
        $this->server->set([
            'task_worker_num'   =>  4,
        ]);
        $this->server->on('request', function ($request, $response) {
            $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
            $action = $request->get['action'];
            $taskId = $this->server->task($action);
            $this->taskMap[$taskId] = $action;
        });
        $this->server->on('task', function($serv, $task_id, $from_id, $data){
            switch($data)
            {
                case 'a':
                    $return = 1;
                    break;
                case 'b':
                    $return = 2;
                    break;
                default:
                    $return = '???';
            }
            $this->server->finish($return);
        });
        $this->server->on('finish', function($serv, $task_id, $data){
            $action = $this->taskMap[$task_id];
            unset($this->taskMap[$task_id]);
            echo "taskId:{$task_id}, action:{$action}, result:{$data}\n";
        });
        $this->server->start();
    }
}
$test = new Test;
$test->run();

访问:http://127.0.0.1:9501/?action=a、http://127.0.0.1:9501/?action=b

可以知道finish执行的是哪个action。当然你说的finish时候返回标识,告诉worker进程是哪个任务,也是可以的,我这个是给你提供另外一种思路

宇润 · 9月30日

展开评论

撰写答案

推广链接