摘要:主函數(shù)查詢(xún)數(shù)據(jù)不手動(dòng)釋放的連接不會(huì)歸還連接池,會(huì)在析構(gòu)時(shí)丟棄執(zhí)行結(jié)果為,說(shuō)明是并行執(zhí)行的。主函數(shù)查詢(xún)數(shù)據(jù)即便拋出了異常,仍然能執(zhí)行到,沒(méi)有導(dǎo)致內(nèi)的一直處于阻塞狀態(tài)。主函數(shù)一次性定時(shí)持續(xù)定時(shí)停止定時(shí)
協(xié)程
Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 協(xié)程技術(shù)開(kāi)發(fā),協(xié)程使用方式與 Golang 幾乎一致,包括框架封裝的協(xié)程池、連接池、命令行處理都大量參考了 Golang 的系統(tǒng)庫(kù)風(fēng)格。
除了缺少 select case 外,Mix PHP 與 Golang 的協(xié)程幾乎一致,框架還提供了連接池、協(xié)程池、命令行處理這些開(kāi)箱即用的封裝。xgo + Channel
xgo 類(lèi)似 Golang 的 go 關(guān)鍵字,可啟動(dòng)一個(gè)新的協(xié)程,Channel 等于 Golang 的 chan 類(lèi),負(fù)責(zé)在不同協(xié)程中傳遞數(shù)據(jù)。
*/ class CoroutineCommand { /** * 主函數(shù) */ public function main() { xgo(function () { $time = time(); $chan = new Channel(); for ($i = 0; $i < 2; $i++) { xgo([$this, "foo"], $chan); } for ($i = 0; $i < 2; $i++) { $result = $chan->pop(); } println("Total time: " . (time() - $time)); }); Event::wait(); } /** * 查詢(xún)數(shù)據(jù) * @param Channel $chan */ public function foo(Channel $chan) { $db = app()->dbPool->getConnection(); $result = $db->createCommand("select sleep(5)")->queryAll(); $db->release(); // 不手動(dòng)釋放的連接不會(huì)歸還連接池,會(huì)在析構(gòu)時(shí)丟棄 $chan->push($result); } }
執(zhí)行結(jié)果為 5s,說(shuō)明是并行執(zhí)行的。
WaitGroup + xdeferWaitGroup 與 Golang 的完全一致,xdefer 方法也等同于 Golang 的 defer 關(guān)鍵字。
當(dāng)并行執(zhí)行且不需要返回結(jié)果時(shí),可以使用 WaitGroup + xdefer,xdefer 即使在方法拋出異常時(shí),仍然會(huì)執(zhí)行,這樣能避免一直處于阻塞狀態(tài)。
*/ class WaitGroupCommand { /** * 主函數(shù) */ public function main() { xgo(function () { $wg = WaitGroup::new(); for ($i = 0; $i < 2; $i++) { $wg->add(1); xgo([$this, "foo"], $wg); } $wg->wait(); println("All done!"); }); Event::wait(); } /** * 查詢(xún)數(shù)據(jù) * @param WaitGroup $wg */ public function foo(WaitGroup $wg) { xdefer(function () use ($wg) { $wg->done(); }); println("work"); throw new RuntimeException("ERROR"); } }
即便拋出了 RuntimeException 異常,仍然能執(zhí)行到 println("All done!");,沒(méi)有導(dǎo)致 wg 內(nèi)的 chan 一直處于阻塞狀態(tài)。
定時(shí)器異步編程中,定時(shí)器的使用非常頻繁。
Timer::new() 可獲得一個(gè)實(shí)例
after 方法可設(shè)置一次性定時(shí)
tick 方法可設(shè)置持續(xù)定時(shí)
停止當(dāng)前定時(shí)期,只需只需對(duì)象的 $timer->clear(); 方法。
*/ class TimerCommand { /** * 主函數(shù) */ public function main() { // 一次性定時(shí) Timer::new()->after(1000, function () { println(time()); }); // 持續(xù)定時(shí) $timer = new Timer(); $timer->tick(1000, function () { println(time()); }); // 停止定時(shí) Timer::new()->after(10000, function () use ($timer) { $timer->clear(); }); Event::wait(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31192.html
摘要:前些時(shí)間我們發(fā)布了實(shí)例協(xié)程池異步郵件發(fā)送守護(hù)程序范例,這一次我們提供一個(gè)使用大廠通過(guò)協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單性能極強(qiáng)的范例。 前些時(shí)間我們發(fā)布了 Mix PHP V2 實(shí)例:協(xié)程池異步郵件發(fā)送守護(hù)程序 范例,這一次我們提供一個(gè)使用大廠 SDK 通過(guò) Swoole Hook 協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單、IO 性能極強(qiáng)的范例。 請(qǐng)先升級(jí)到 m...
摘要:消費(fèi)者開(kāi)發(fā)使用本例時(shí),請(qǐng)確保你使用的編譯時(shí)開(kāi)啟了本例我們采用的守護(hù)程序協(xié)程池來(lái)完成一個(gè)超高性能的郵件發(fā)送程序。 去年 Mix PHP V1 發(fā)布時(shí),我寫(xiě)了一個(gè)多進(jìn)程的郵件發(fā)送實(shí)例: 使用 mixphp 打造多進(jìn)程異步郵件發(fā)送,今年 Mix PHP V2 發(fā)布,全面的協(xié)程支持讓我們可以使用一個(gè)進(jìn)程就可達(dá)到之前多個(gè)進(jìn)程都無(wú)法達(dá)到的更高 IO 性能,所以今天重寫(xiě)一個(gè)協(xié)程池版本的郵件發(fā)送實(shí)例。...
摘要:是一個(gè)非常流行的的客戶(hù)端,現(xiàn)在各大廠的也都開(kāi)始基于開(kāi)發(fā),因?yàn)橹恢С值膮f(xié)程,而默認(rèn)是使用擴(kuò)展的,所以開(kāi)發(fā)了,能在不修改源碼的情況下讓協(xié)程化。 Guzzle 是一個(gè)非常流行的 PHP 的 HTTP 客戶(hù)端,現(xiàn)在各大廠的 SDK 也都開(kāi)始基于 Guzzle 開(kāi)發(fā),因?yàn)?Swoole 只支持 PHP Stream 的協(xié)程 Hook ,而 Guzzle 默認(rèn)是使用 cURL 擴(kuò)展的,所以 Mix...
摘要:事件驅(qū)動(dòng)的異步編程模式異步協(xié)議的服務(wù)器端客戶(hù)端支持支持隧道加密支持并發(fā)百萬(wàn)長(zhǎng)連接支持毫秒定時(shí)器支持異步同步協(xié)程支持親和性設(shè)置守護(hù)進(jìn)程版本目前上穩(wěn)定版本是,最新消息,要邁入,徹底協(xié)程化。 Swoole:面向生產(chǎn)環(huán)境的 PHP 異步網(wǎng)絡(luò)通信引擎 官網(wǎng)原話:使 PHP 開(kāi)發(fā)人員可以編寫(xiě)高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務(wù)。Swoole ...
摘要:之前的版本用的管理全段資源,版本開(kāi)始使用的來(lái)管理。不過(guò),并不是強(qiáng)制要求在開(kāi)發(fā)期間使用它。發(fā)布問(wèn)題標(biāo)題標(biāo)題編輯器容器內(nèi)容發(fā)布問(wèn)題實(shí)例化編輯器設(shè)置如果沒(méi)有預(yù)加載,否則不會(huì)出現(xiàn) Laravel5.4 之前的版本用 gulp 的 laravel-elixir管理全段資源,Laravel5.4 版本開(kāi)始使用webpack 的 Laravel Mix 來(lái)管理。 一、簡(jiǎn)介 Laravel Mix 提...
閱讀 2919·2021-11-15 18:02
閱讀 3814·2021-10-14 09:43
閱讀 3753·2021-09-08 10:41
閱讀 2529·2019-08-30 15:53
閱讀 1812·2019-08-30 14:14
閱讀 1958·2019-08-29 16:12
閱讀 3153·2019-08-29 14:03
閱讀 1286·2019-08-29 13:46