成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

仿照async/await風(fēng)格對(duì)Swoole4協(xié)程的簡(jiǎn)單包裝

_ivan / 1476人閱讀

摘要:官方文檔中對(duì)協(xié)程的示例大多按照一次請(qǐng)求一個(gè)協(xié)程或腳本并發(fā)大量協(xié)程的方式來(lái)舉例說(shuō)明這種使用方式下提升的是整體的性能而非單次請(qǐng)求的響應(yīng)時(shí)間要提升單次請(qǐng)求的響應(yīng)效率或提升非網(wǎng)絡(luò)服務(wù)下腳本代碼的運(yùn)行效率需要在業(yè)務(wù)代碼中主動(dòng)使用協(xié)程來(lái)處理那些可并發(fā)的

Swoole官方文檔中對(duì)協(xié)程的示例大多按照一次請(qǐng)求一個(gè)協(xié)程(或腳本并發(fā)大量協(xié)程)的方式來(lái)舉例說(shuō)明,這種使用方式下提升的是整體的性能,而非單次請(qǐng)求的響應(yīng)時(shí)間.
要提升單次請(qǐng)求的響應(yīng)效率(或提升非網(wǎng)絡(luò)服務(wù)下php腳本代碼的運(yùn)行效率),需要在業(yè)務(wù)代碼中主動(dòng)使用協(xié)程來(lái)處理那些可并發(fā)的,耗時(shí)的代碼.
這時(shí)便涉及到協(xié)程數(shù)據(jù)交互的情況,官方文檔中使用chan舉了一個(gè)生產(chǎn)者消費(fèi)者的例子,但是如果業(yè)務(wù)代碼都按照這個(gè)風(fēng)格的話較為復(fù)雜.
js及c#的async/await風(fēng)格使用相對(duì)簡(jiǎn)單,所以結(jié)合Swoole協(xié)程的csp模型及php語(yǔ)法情況,仿照async/await的風(fēng)格做了如下簡(jiǎn)單包裝.
包裝方法代碼
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;
}
調(diào)用舉例
$test = co_run(function(){
    //執(zhí)行代碼并返回結(jié)果
});
//執(zhí)行其他代碼
co_wait($test);//由于使用了chan的pop方法,所以需要當(dāng)前在協(xié)程上下文
var_dump($test);
PHP7.4后箭頭函數(shù)調(diào)用舉例
$test = co_run(fn() => "單行的執(zhí)行代碼,如多行仍需按照原有方式");
//執(zhí)行其他代碼
co_wait($test);//由于使用了chan的pop方法,所以需要當(dāng)前在協(xié)程上下文
var_dump($test);
總結(jié)
經(jīng)過(guò)這樣簡(jiǎn)單的包裝,可以在業(yè)務(wù)代碼中存在可并發(fā)的多次調(diào)用或循環(huán)調(diào)用場(chǎng)景下使用,壓縮單次處理時(shí)間.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31761.html

相關(guān)文章

  • 通讀Python官方文檔之協(xié)程、Future與Task

    摘要:所以在第一遍閱讀官方文檔的時(shí)候,感覺完全是在夢(mèng)游。通過(guò)或者等待另一個(gè)協(xié)程的結(jié)果或者異常,異常會(huì)被傳播。接口返回的結(jié)果指示已結(jié)束,并賦值。取消與取消不同。調(diào)用將會(huì)向被包裝的協(xié)程拋出。任務(wù)相關(guān)函數(shù)安排協(xié)程的執(zhí)行。負(fù)責(zé)切換線程保存恢復(fù)。 Tasks and coroutines 翻譯的python官方文檔 這個(gè)問(wèn)題的惡心之處在于,如果你要理解coroutine,你應(yīng)該理解future和tas...

    mgckid 評(píng)論0 收藏0
  • 現(xiàn)有PHP項(xiàng)目引入Swoole4協(xié)程支持的流程及難點(diǎn)

    摘要:之后協(xié)程化支持已經(jīng)完善并且支持大量的擴(kuò)展自動(dòng)協(xié)程化一些基于的框架也蓬勃發(fā)展光看著文檔就讓人躍躍欲試但是對(duì)于現(xiàn)有舊項(xiàng)目如何引入并啟用協(xié)程成了實(shí)際場(chǎng)景中的客觀問(wèn)題由于協(xié)程性質(zhì)及生命周期等原因這并非想象的那么容易本文整理了在現(xiàn)有項(xiàng)目中引入并開啟協(xié) Swoole4之后,協(xié)程化支持已經(jīng)完善,并且支持大量的PHP擴(kuò)展自動(dòng)協(xié)程化.一些基于Swoole4的框架也蓬勃發(fā)展,光看著文檔就讓人躍躍欲試.但是...

    高勝山 評(píng)論0 收藏0
  • Tornado 4.3文檔翻譯: 用戶指南-協(xié)程

    摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次...

    SimonMa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<