摘要:官方文檔中對(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
摘要:所以在第一遍閱讀官方文檔的時(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...
摘要:之后協(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ā)展,光看著文檔就讓人躍躍欲試.但是...
摘要:譯者說(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)步。其次...
閱讀 3395·2021-10-13 09:40
閱讀 2619·2021-10-08 10:17
閱讀 4030·2021-09-28 09:45
閱讀 960·2021-09-28 09:35
閱讀 1846·2019-08-30 10:51
閱讀 2931·2019-08-26 12:11
閱讀 1677·2019-08-26 10:41
閱讀 3120·2019-08-23 17:10