仿照async/await风格对Swoole4协程的简单包装

栏目: PHP · 发布时间: 5年前

内容简介: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);

总结

经过这样简单的包装,可以在业务代码中存在可并发的多次调用或循环调用场景下使用,压缩单次处理时间.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

IT大败局

IT大败局

Merrill R.Chapman、周良忠 / 周良忠 / 电子工业出版社 / 2004-8-1 / 35.00

这是一本由作者亲身经历写就的MBA式教案。通过作者那专业人士的敏锐、活泼流畅的文笔和美国人特有的幽默,本书为我们剖析了IT界十个有代表性且影响深远的愚蠢败局。这十个败局涉及企业经营的十个主要方面,它们是:产业标准的魔力,“缩水”产品的阴霾,产品定位的泥潭,市场关系的教训,巨型企业的困惑,企业并购的陷阱,品牌战略的迷茫,技术导向的失衡,企业公关的真谛和科技虚幻的诱惑。 书中有许多鲜为人......一起来看看 《IT大败局》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具