task_enable_coroutine
最后更新于:2022-04-02 06:23:31
# task\_enable\_coroutine
[TOC]
> 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->workerId;
//任务的编号
$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_coroutine`,`Task`工作进程支持协程
* 未开启`task_enable_coroutine`,仅支持同步阻塞
';