资讯专栏INFORMATION COLUMN

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

_ivan / 1366人阅读

摘要:官方文档中对协程的示例大多按照一次请求一个协程或脚本并发大量协程的方式来举例说明这种使用方式下提升的是整体的性能而非单次请求的响应时间要提升单次请求的响应效率或提升非网络服务下脚本代码的运行效率需要在业务代码中主动使用协程来处理那些可并发的

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);
总结
经过这样简单的包装,可以在业务代码中存在可并发的多次调用或循环调用场景下使用,压缩单次处理时间.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31761.html

相关文章

  • 通读Python官方文档之协程、Future与Task

    摘要:所以在第一遍阅读官方文档的时候,感觉完全是在梦游。通过或者等待另一个协程的结果或者异常,异常会被传播。接口返回的结果指示已结束,并赋值。取消与取消不同。调用将会向被包装的协程抛出。任务相关函数安排协程的执行。负责切换线程保存恢复。 Tasks and coroutines 翻译的python官方文档 这个问题的恶心之处在于,如果你要理解coroutine,你应该理解future和tas...

    mgckid 评论0 收藏0
  • 现有PHP项目引入Swoole4协程支持的流程及难点

    摘要:之后协程化支持已经完善并且支持大量的扩展自动协程化一些基于的框架也蓬勃发展光看着文档就让人跃跃欲试但是对于现有旧项目如何引入并启用协程成了实际场景中的客观问题由于协程性质及生命周期等原因这并非想象的那么容易本文整理了在现有项目中引入并开启协 Swoole4之后,协程化支持已经完善,并且支持大量的PHP扩展自动协程化.一些基于Swoole4的框架也蓬勃发展,光看着文档就让人跃跃欲试.但是...

    高胜山 评论0 收藏0
  • Tornado 4.3文档翻译: 用户指南-协程

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...

    SimonMa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<