摘要:官方文檔中對協(xié)程的示例大多按照一次請求一個協(xié)程或腳本并發(fā)大量協(xié)程的方式來舉例說明這種使用方式下提升的是整體的性能而非單次請求的響應時間要提升單次請求的響應效率或提升非網絡服務下腳本代碼的運行效率需要在業(yè)務代碼中主動使用協(xié)程來處理那些可并發(fā)的
Swoole官方文檔中對協(xié)程的示例大多按照一次請求一個協(xié)程(或腳本并發(fā)大量協(xié)程)的方式來舉例說明,這種使用方式下提升的是整體的性能,而非單次請求的響應時間.包裝方法代碼
要提升單次請求的響應效率(或提升非網絡服務下php腳本代碼的運行效率),需要在業(yè)務代碼中主動使用協(xié)程來處理那些可并發(fā)的,耗時的代碼.
這時便涉及到協(xié)程數據交互的情況,官方文檔中使用chan舉了一個生產者消費者的例子,但是如果業(yè)務代碼都按照這個風格的話較為復雜.
js及c#的async/await風格使用相對簡單,所以結合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; }調用舉例
$test = co_run(function(){ //執(zhí)行代碼并返回結果 }); //執(zhí)行其他代碼 co_wait($test);//由于使用了chan的pop方法,所以需要當前在協(xié)程上下文 var_dump($test);PHP7.4后箭頭函數調用舉例
$test = co_run(fn() => "單行的執(zhí)行代碼,如多行仍需按照原有方式"); //執(zhí)行其他代碼 co_wait($test);//由于使用了chan的pop方法,所以需要當前在協(xié)程上下文 var_dump($test);總結
經過這樣簡單的包裝,可以在業(yè)務代碼中存在可并發(fā)的多次調用或循環(huán)調用場景下使用,壓縮單次處理時間.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31761.html
摘要:所以在第一遍閱讀官方文檔的時候,感覺完全是在夢游。通過或者等待另一個協(xié)程的結果或者異常,異常會被傳播。接口返回的結果指示已結束,并賦值。取消與取消不同。調用將會向被包裝的協(xié)程拋出。任務相關函數安排協(xié)程的執(zhí)行。負責切換線程保存恢復。 Tasks and coroutines 翻譯的python官方文檔 這個問題的惡心之處在于,如果你要理解coroutine,你應該理解future和tas...
摘要:之后協(xié)程化支持已經完善并且支持大量的擴展自動協(xié)程化一些基于的框架也蓬勃發(fā)展光看著文檔就讓人躍躍欲試但是對于現有舊項目如何引入并啟用協(xié)程成了實際場景中的客觀問題由于協(xié)程性質及生命周期等原因這并非想象的那么容易本文整理了在現有項目中引入并開啟協(xié) Swoole4之后,協(xié)程化支持已經完善,并且支持大量的PHP擴展自動協(xié)程化.一些基于Swoole4的框架也蓬勃發(fā)展,光看著文檔就讓人躍躍欲試.但是...
摘要:譯者說于年月日發(fā)布,該版本正式支持的關鍵字,并且用舊版本編譯同樣可以使用這兩個關鍵字,這無疑是一種進步。其次,這是最后一個支持和的版本了,在后續(xù)的版本了會移除對它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個關鍵字,這無疑是一種進步。其次...
閱讀 3351·2021-10-13 09:40
閱讀 2586·2021-10-08 10:17
閱讀 3989·2021-09-28 09:45
閱讀 922·2021-09-28 09:35
閱讀 1805·2019-08-30 10:51
閱讀 2898·2019-08-26 12:11
閱讀 1645·2019-08-26 10:41
閱讀 3091·2019-08-23 17:10