摘要:基于實(shí)用,抽象事件處理類,實(shí)現(xiàn)與底層的回調(diào)的解耦,支持協(xié)程調(diào)度,同步異步調(diào)用,全局事件注冊(cè),心跳檢查,異步任務(wù),多進(jìn)程池等,內(nèi)置等常用組件等。
swoolefy是一個(gè)基于swoole實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的API和Web應(yīng)用服務(wù)框架, 高度封裝了http,websocket,udp服務(wù)器,以及基于tcp實(shí)現(xiàn)可擴(kuò)展的rpc服務(wù), 同時(shí)支持composer包方式安裝部署項(xiàng)目。基于實(shí)用,swoolefy抽象Event事件處理類, 實(shí)現(xiàn)與底層的回調(diào)的解耦,支持協(xié)程調(diào)度,同步|異步調(diào)用,全局事件注冊(cè),心跳檢查,異步任務(wù),多進(jìn)程(池)等, 內(nèi)置view、log、session、mysql、redis、mongodb等常用組件等。
目前swoolefy4.2+版本完全支持swoole4.2.13+的協(xié)程,推薦使用swoole4.3+
GitHub:https://github.com/bingcool/s...
下面主要講解一下如何實(shí)現(xiàn)了類似go的waitGroup的功能
1、定義GoWaitGroup的類:
+---------------------------------------------------------------------- */ namespace SwoolefyCore; use SwooleCoroutineChannel; class GoWaitGroup { /** * @var int */ private $count = 0; /** * @var Channel */ private $chan; /** * @var array */ private $result = []; /** * WaitGroup constructor */ public function __construct() { $this->chan = new Channel; } /** * add */ public function go(Closure $go_func = null) { $this->count++; if($go_func instanceof Closure) { go($go_func); } } /** * start */ public function start() { $this->count++; return $this->count; } /** * done */ public function done(string $key, $data = null) { if(!empty($data)) { $this->result[$key] = $data; } $this->chan->push(1); } /** * wait */ public function wait() { while($this->count--) { $this->chan->pop(); } $result = $this->result; $this->result = []; $this->count = 0; return $result; } }
2、在swoolefy中調(diào)用
class GroupController extends BController { public function waitgroup() { // 創(chuàng)建一個(gè)waitGroup實(shí)例 $wg = new SwoolefyCoreGoWaitGroup(); // 第一種方式,直接$wg->go()函數(shù)中執(zhí)行g(shù)o的協(xié)程函數(shù) $wg->go(function() use ($wg) { // 掛起協(xié)程 $fp = stream_socket_client("tcp://www.baidu.com:80", $errno, $errstr, 30); // 協(xié)程返回的數(shù)據(jù) $wg->done("mysql", "mysql"); }); $wg->go(function() use ($wg) { sleep(1); $wg->done("tengxun", "weixin and qq"); }); //掛起當(dāng)前協(xié)程,等待所有任務(wù)完成后恢復(fù) //$result = $wg->wait(); //這里 $result 包含了 1 個(gè)任務(wù)執(zhí)行結(jié)果 //var_dump($result); //第二種方式,添加$wg->start(),啟動(dòng)協(xié)程,然后使用swoole的原生go執(zhí)行協(xié)程函數(shù) $wg->start(); go(function () use ($wg) { // 掛起協(xié)程 sleep(1); $wg->done("taobao", "ali baba"); }); //第二種方式,添加$wg->start(),啟動(dòng)協(xié)程,然后使用swoole的原生go執(zhí)行協(xié)程函數(shù) $wg->start(); go(function () use ($wg) { // 掛起協(xié)程 sleep(1); $wg->done("baidu", "baidu"); }); // 以上三個(gè)協(xié)程將會(huì)并發(fā)調(diào)用,wait()函數(shù)實(shí)現(xiàn)等待三個(gè)協(xié)程數(shù)據(jù)返回 //掛起當(dāng)前協(xié)程,讓出cpu控制權(quán),cpu可以做其他的事情,直到待所有任務(wù)完成后恢復(fù) $result = $wg->wait(); //這里 $result 包含了 2 個(gè)任務(wù)執(zhí)行結(jié)果 var_dump($result); } }
至此一個(gè)最簡(jiǎn)單的并發(fā)調(diào)用就完成了,你可以愉快使用gowaitGroup的協(xié)程調(diào)用了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31360.html
摘要:易用穩(wěn)定,本次想通過(guò)對(duì)的學(xué)習(xí)和個(gè)人解析,吸收框架的思想和設(shè)計(jì)知識(shí),加強(qiáng)自己對(duì)的認(rèn)知和理解。當(dāng)然,筆者能力水平有限,后續(xù)的文章如有錯(cuò)誤,還請(qǐng)指出和諒解。目錄如下后續(xù)添加文章都會(huì)記錄在此服務(wù)啟動(dòng)過(guò)程以及主體設(shè)計(jì)流程源碼解析 前言 swoole是什么?官網(wǎng)的原話介紹是這樣的: Swoole 使用純 C 語(yǔ)言編寫,提供了 PHP 語(yǔ)言的異步多線程服務(wù)器,異步 TCP/UDP 網(wǎng)絡(luò)客戶端,異步 ...
摘要:為語(yǔ)言提供了強(qiáng)大的協(xié)程編程模式。提供的協(xié)程語(yǔ)法借鑒自,在此向開發(fā)組致敬協(xié)程可以與很好地互補(bǔ)。并發(fā)執(zhí)行使用創(chuàng)建協(xié)程,可以讓和兩個(gè)函數(shù)變成并發(fā)執(zhí)行。協(xié)程需要拿到請(qǐng)求的結(jié)果。 Swoole4為PHP語(yǔ)言提供了強(qiáng)大的CSP協(xié)程編程模式。底層提供了3個(gè)關(guān)鍵詞,可以方便地實(shí)現(xiàn)各類功能。 Swoole4提供的PHP協(xié)程語(yǔ)法借鑒自Golang,在此向GO開發(fā)組致敬 PHP+Swoole協(xié)程可以與...
摘要:是一個(gè)基于擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的和應(yīng)用服務(wù)框架高度封裝了,,服務(wù)器,以及基于實(shí)現(xiàn)可擴(kuò)展的服務(wù),同時(shí)支持包方式安裝部署項(xiàng)目。基于實(shí)用,抽象事件處理類,實(shí)現(xiàn)與底層的回調(diào)的解耦,支持同步異步調(diào)用,內(nèi)置等常用組件等。 swoolefy swoolefy是一個(gè)基于swoole擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的API和Web應(yīng)用服務(wù)框架,高度封裝了http,websocket,ud...
摘要:協(xié)程與信箱得益于,我們可以基于的協(xié)程與快速實(shí)現(xiàn)一個(gè)信箱模式調(diào)度。樣例代碼比如在一個(gè)聊天室中,我們可以定義一個(gè)房間模型。 什么是Actor? Actor對(duì)于PHPer來(lái)說(shuō),可能會(huì)比較陌生,寫過(guò)Java的同學(xué)會(huì)比較熟悉,Java一直都有線程的概念(雖然PHP有Pthread,但不普及),它是一種非共享內(nèi)存的并發(fā)模型,每個(gè)Actor內(nèi)的數(shù)據(jù)獨(dú)立存在,Actor之間通過(guò)消息傳遞的形式進(jìn)行交互調(diào)...
摘要:現(xiàn)在在后端業(yè)務(wù)開發(fā)編程方面,技術(shù)力量強(qiáng)的團(tuán)隊(duì)已經(jīng)開始將技術(shù)棧從同步模式切換為異步了。使用這些技術(shù)方案是無(wú)法兼容已有程序的。影響了異步回調(diào)技術(shù)棧的普及。將會(huì)成為未來(lái)后端開發(fā)領(lǐng)域的主流技術(shù)方案。 今天太忙,少寫一點(diǎn),后面再補(bǔ)充。 異步模式 Go 語(yǔ)言越來(lái)越熱門,很多大型互聯(lián)網(wǎng)公司后端正在轉(zhuǎn)向 GO 。Java 圈知名的服務(wù)化框架 Dubbo 也宣布轉(zhuǎn)型異步模式。這是一個(gè)大趨勢(shì),異步模式已經(jīng)...
閱讀 3735·2021-11-24 10:46
閱讀 1706·2021-11-15 11:38
閱讀 3761·2021-11-15 11:37
閱讀 3481·2021-10-27 14:19
閱讀 1939·2021-09-03 10:36
閱讀 1991·2021-08-16 11:02
閱讀 2998·2019-08-30 15:55
閱讀 2251·2019-08-30 15:44