多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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`,仅支持同步阻塞