亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

仿照async/await風格對Swoole4協(xié)程的簡單包裝

_ivan / 1558人閱讀

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

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

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31761.html

相關(guān)文章

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

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

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

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

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

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

    SimonMa 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<