摘要:之前過行代碼實現通用協程池今天看了下相關文檔,用也實現了一個,由于沒有的,所以實現的有點簡單,但是實用性還可以,通過工廠函數實現了通用性。官方的協程池是用只能用在。因為協程池代碼層耦合了實例化邏輯。
之前過golang40行代碼實現通用協程池
今天看了下swoole相關文檔,用PHP也實現了一個,由于swoole沒有golang的select,所以實現的有點簡單,但是實用性還可以,通過工廠函數實現了通用性。
swoole官方的協程池是用只能用在Redis。因為協程池代碼層耦合了Redis實例化邏輯。
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); } }
我們代碼里面不關心創建連接的具體邏輯,只要調用工廠方法即可。
項目地址項目已經開源到githubhttps://github.com/swoole-foundation/swoole-pool
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31517.html
摘要:前些時間我們發布了實例協程池異步郵件發送守護程序范例,這一次我們提供一個使用大廠通過協程化來并行執行短信發送任務,本文是一個代碼簡單性能極強的范例。 前些時間我們發布了 Mix PHP V2 實例:協程池異步郵件發送守護程序 范例,這一次我們提供一個使用大廠 SDK 通過 Swoole Hook 協程化來并行執行短信發送任務,本文是一個代碼簡單、IO 性能極強的范例。 請先升級到 m...
摘要:消費者開發使用本例時,請確保你使用的編譯時開啟了本例我們采用的守護程序協程池來完成一個超高性能的郵件發送程序。 去年 Mix PHP V1 發布時,我寫了一個多進程的郵件發送實例: 使用 mixphp 打造多進程異步郵件發送,今年 Mix PHP V2 發布,全面的協程支持讓我們可以使用一個進程就可達到之前多個進程都無法達到的更高 IO 性能,所以今天重寫一個協程池版本的郵件發送實例。...
摘要:主函數查詢數據不手動釋放的連接不會歸還連接池,會在析構時丟棄執行結果為,說明是并行執行的。主函數查詢數據即便拋出了異常,仍然能執行到,沒有導致內的一直處于阻塞狀態。主函數一次性定時持續定時停止定時 協程 Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 協程技術開發,協程使用方式與 Golang 幾乎一致,包括框架封裝的協程池、連接池、命令行處理都大量參...
閱讀 1905·2021-11-25 09:43
閱讀 1405·2021-11-22 14:56
閱讀 3280·2021-11-22 09:34
閱讀 2010·2021-11-15 11:37
閱讀 2256·2021-09-01 10:46
閱讀 1396·2019-08-30 15:44
閱讀 2294·2019-08-30 13:15
閱讀 2393·2019-08-29 13:07