task_enable_coroutine

v4.2.12起支持

现状

RFC-1014提案使TaskWorker内可以使用异步和协程API。由于Task设计之初未考虑支持异步和协程,因此带来了新的问题。

  • 无法使用return返回值作为任务的结果
  • 在异步或协程的程序中Server::finish可能会使用错误的任务上下文
  • onTask回调函数中仍然需要使用go手工创建协程,无法直接使用协程组件

修改

增加task_enable_coroutine,开启后自动在onTask回调中创建协程,php代码可以直接使用协程API。 底层修改了onTask回调的参数。新增Swoole\Server\Task类,用于保存任务上下文,并返回结果。

未开启task_enable_coroutine时,仍然使用旧版本的4参数回调

$server->on('Task', function ($serv, Swoole\Server\Task $task) {
    //来自哪个`Worker`进程
    $task->worker_id;
    //任务的编号
    $task->id;
    //任务的类型,taskwait, task, taskCo, taskWaitMulti 可能使用不同的 flags
    $task->flags;
    //任务的数据
    $task->data;
    //协程 API
    co::sleep(0.2);
    //完成任务,结束并返回数据
    $task->finish([123, 'hello']);
});

配置

task_enable_coroutine必须在enable_coroutine == true时才可以使用

$server->set([
    'task_enable_coroutine' => true,
]);

废弃

由于task_async配置存在严重的问题,在新的版本中将移除。这与旧版本会存在兼容性问题。请务必注意。

注意

仅存在两种模式:

  • 开启task_enable_coroutineTask工作进程支持协程

  • 未开启task_enable_coroutine,仅支持同步阻塞



  • 索鸟

    开启了 task 协程选项 启动服务的时候 在 workstart回调中调用 协程客户端 会提示 MysqlDB::connect(): must be called in the coroutine 把task 设置为0 就不会报错。。。