摘要:之前過行代碼實(shí)現(xiàn)通用協(xié)程池今天看了下相關(guān)文檔,用也實(shí)現(xiàn)了一個(gè),由于沒有的,所以實(shí)現(xiàn)的有點(diǎn)簡(jiǎn)單,但是實(shí)用性還可以,通過工廠函數(shù)實(shí)現(xiàn)了通用性。官方的協(xié)程池是用只能用在。因?yàn)閰f(xié)程池代碼層耦合了實(shí)例化邏輯。
之前過golang40行代碼實(shí)現(xiàn)通用協(xié)程池
今天看了下swoole相關(guān)文檔,用PHP也實(shí)現(xiàn)了一個(gè),由于swoole沒有golang的select,所以實(shí)現(xiàn)的有點(diǎn)簡(jiǎn)單,但是實(shí)用性還可以,通過工廠函數(shù)實(shí)現(xiàn)了通用性。
swoole官方的協(xié)程池是用只能用在Redis。因?yàn)閰f(xié)程池代碼層耦合了Redis實(shí)例化邏輯。
class RedisPool { /** * @var SwooleCoroutineChannel */ protected $pool; /** * RedisPool constructor. * @param int $size 連接池的尺寸 */ function __construct($size = 100) { $this->pool = new SwooleCoroutineChannel($size); for ($i = 0; $i < $size; $i++) { $redis = new SwooleCoroutineRedis(); $res = $redis->connect("127.0.0.1", 6379); if ($res == false) { throw new RuntimeException("failed to connect redis server."); } else { $this->put($redis); } } } function put($redis) { $this->pool->push($redis); } function get() { return $this->pool->pop(); } }
利用工廠方法的改造如下:
size = $size; $this->factory = $factory; $this->init(); } /** * check pool config * @throws InvalidParamException */ private function init() { if ($this->size <= 0) { throw new InvalidParamException("The "size" property must be greater than zero."); } if (empty($this->factory)) { throw new InvalidParamException("The "factory" property must be set."); } if (!is_callable($this->factory)) { throw new InvalidParamException("The "factory" property must be callable."); } $this->bootstrap(); } /** * bootstrap pool */ private function bootstrap() { $this->channel = new Channel($this->size); for ($i = 0; $i < $this->size; $i++) { $this->channel->push(call_user_func($this->factory)); } } /** * Acquire a connection * @param int $timeout * @return mixed */ public function acquire($timeout = 0) { return $this->channel->pop($timeout); } /** * Release a resource * @param mixed $resource */ public function release($resource) { $this->channel->push($resource); } }
我們代碼里面不關(guān)心創(chuàng)建連接的具體邏輯,只要調(diào)用工廠方法即可。
項(xiàng)目地址項(xiàng)目已經(jīng)開源到githubhttps://github.com/swoole-foundation/swoole-pool
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31517.html
摘要:前些時(shí)間我們發(fā)布了實(shí)例協(xié)程池異步郵件發(fā)送守護(hù)程序范例,這一次我們提供一個(gè)使用大廠通過協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單性能極強(qiáng)的范例。 前些時(shí)間我們發(fā)布了 Mix PHP V2 實(shí)例:協(xié)程池異步郵件發(fā)送守護(hù)程序 范例,這一次我們提供一個(gè)使用大廠 SDK 通過 Swoole Hook 協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單、IO 性能極強(qiáng)的范例。 請(qǐng)先升級(jí)到 m...
摘要:消費(fèi)者開發(fā)使用本例時(shí),請(qǐng)確保你使用的編譯時(shí)開啟了本例我們采用的守護(hù)程序協(xié)程池來(lái)完成一個(gè)超高性能的郵件發(fā)送程序。 去年 Mix PHP V1 發(fā)布時(shí),我寫了一個(gè)多進(jìn)程的郵件發(fā)送實(shí)例: 使用 mixphp 打造多進(jìn)程異步郵件發(fā)送,今年 Mix PHP V2 發(fā)布,全面的協(xié)程支持讓我們可以使用一個(gè)進(jìn)程就可達(dá)到之前多個(gè)進(jìn)程都無(wú)法達(dá)到的更高 IO 性能,所以今天重寫一個(gè)協(xié)程池版本的郵件發(fā)送實(shí)例。...
摘要:主函數(shù)查詢數(shù)據(jù)不手動(dòng)釋放的連接不會(huì)歸還連接池,會(huì)在析構(gòu)時(shí)丟棄執(zhí)行結(jié)果為,說明是并行執(zhí)行的。主函數(shù)查詢數(shù)據(jù)即便拋出了異常,仍然能執(zhí)行到,沒有導(dǎo)致內(nèi)的一直處于阻塞狀態(tài)。主函數(shù)一次性定時(shí)持續(xù)定時(shí)停止定時(shí) 協(xié)程 Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 協(xié)程技術(shù)開發(fā),協(xié)程使用方式與 Golang 幾乎一致,包括框架封裝的協(xié)程池、連接池、命令行處理都大量參...
閱讀 1917·2021-11-25 09:43
閱讀 1423·2021-11-22 14:56
閱讀 3288·2021-11-22 09:34
閱讀 2027·2021-11-15 11:37
閱讀 2282·2021-09-01 10:46
閱讀 1408·2019-08-30 15:44
閱讀 2304·2019-08-30 13:15
閱讀 2403·2019-08-29 13:07