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

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

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

总结

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


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

查看所有标签

猜你喜欢:

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

Powerful

Powerful

Patty McCord / Missionday / 2018-1-25

Named by The Washington Post as one of the 11 Leadership Books to Read in 2018 When it comes to recruiting, motivating, and creating great teams, Patty McCord says most companies have it all wrong. Mc......一起来看看 《Powerful》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具