内容简介:Swoole官方文档中对协程的示例大多按照一次请求一个协程(或脚本并发大量协程)的方式来举例说明,这种使用方式下提升的是整体的性能,而非单次请求的响应时间.要提升单次请求的响应效率(或提升非网络服务下php脚本代码的运行效率),需要在业务代码中主动使用协程来处理那些可并发的,耗时的代码.这时便涉及到协程数据交互的情况,官方文档中使用chan举了一个生产者消费者的例子,但是如果业务代码都按照这个风格的话较为复杂.
Swoole官方文档中对协程的示例大多按照一次请求一个协程(或脚本并发大量协程)的方式来举例说明,这种使用方式下提升的是整体的性能,而非单次请求的响应时间.
要提升单次请求的响应效率(或提升非网络服务下 php 脚本代码的运行效率),需要在业务代码中主动使用协程来处理那些可并发的,耗时的代码.
这时便涉及到协程数据交互的情况,官方文档中使用chan举了一个生产者消费者的例子,但是如果业务代码都按照这个风格的话较为复杂.
js及c#的async/await风格使用相对简单,所以结合Swoole协程的csp模型及php语法情况,仿照async/await的风格做了如下简单包装.
包装方法代码
class CoTask { protected $chan = null; public function __construct(\Chan $chan){ $this->chan = $chan; } public function wait(){ if($this->chan instanceof \Chan){ $result = $this->chan->pop(); $this->chan = null; if(!empty($result['exception']) && $result['exception'] instanceof \Throwable){ throw $result['exception']; }else{ return $result['result']; } }else{ throw new \Exception('exception'); } } } function co_run($func){ $chan = new \Chan(1); $task = new \CoTask($chan); go(function() use ($chan,$func){ $result = ['result' => null,'exception' => null]; try{ $result['result'] = $func(); }catch (\Throwable $e){ $result['exception'] = $e; } $chan->push($result); }); return $task; } function co_wait(&$task){ if($task instanceof \CoTask){ $task = $task->wait(); } return $task; }
调用举例
$test = co_run(function(){ //执行代码并返回结果 }); //执行其他代码 co_wait($test);//由于使用了chan的pop方法,所以需要当前在协程上下文 var_dump($test);
PHP7.4后箭头函数调用举例
$test = co_run(fn() => "单行的执行代码,如多行仍需按照原有方式"); //执行其他代码 co_wait($test);//由于使用了chan的pop方法,所以需要当前在协程上下文 var_dump($test);
总结
经过这样简单的包装,可以在业务代码中存在可并发的多次调用或循环调用场景下使用,压缩单次处理时间.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Swift编写--仿照Twitter客户端
- 如何仿照OSINT模式进行机密信息的收集与发掘
- 仿照laravel-artisan实现简易go开发脚手架
- Java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo
- 谷歌开源项目风格指南之 Python 风格指南
- JavaScript代码风格要素
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
零基础学Minecraft编程
Martin O''Hanlon、David Whale / 中文Minecraft Wiki翻译团队 / 人民邮电出版社 / 2015-9-7 / 79
在你体验Minecraft冒险的同时,学习宝贵的编程技能! 如果你很喜欢玩Minecraft,却被游戏中的建造耗费大量时间而困扰,并且你想要对游戏添加一些改动,那么本书就是为你而设计的。在游戏中,你可以学习许多Python编程技能,在PC、Mac或树莓派上与游戏进行互动。这些冒险不仅局限在虚拟世界——你也将会学习如何将Minecraft与电子元件连接起来,这样你的Minecraft世界就能够......一起来看看 《零基础学Minecraft编程》 这本书的介绍吧!