国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

swoole通用協程池的實現

wanghui / 1113人閱讀

摘要:之前過行代碼實現通用協程池今天看了下相關文檔,用也實現了一個,由于沒有的,所以實現的有點簡單,但是實用性還可以,通過工廠函數實現了通用性。官方的協程池是用只能用在。因為協程池代碼層耦合了實例化邏輯。

之前過golang40行代碼實現通用協程池

今天看了下swoole相關文檔,用PHP也實現了一個,由于swoole沒有golangselect,所以實現的有點簡單,但是實用性還可以,通過工廠函數實現了通用性。

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 實例:AliCloud 短信程池異步發送守護程序

    摘要:前些時間我們發布了實例協程池異步郵件發送守護程序范例,這一次我們提供一個使用大廠通過協程化來并行執行短信發送任務,本文是一個代碼簡單性能極強的范例。 前些時間我們發布了 Mix PHP V2 實例:協程池異步郵件發送守護程序 范例,這一次我們提供一個使用大廠 SDK 通過 Swoole Hook 協程化來并行執行短信發送任務,本文是一個代碼簡單、IO 性能極強的范例。 請先升級到 m...

    qc1iu 評論0 收藏0
  • Mix PHP V2 實例:程池異步郵件發送守護程序

    摘要:消費者開發使用本例時,請確保你使用的編譯時開啟了本例我們采用的守護程序協程池來完成一個超高性能的郵件發送程序。 去年 Mix PHP V1 發布時,我寫了一個多進程的郵件發送實例: 使用 mixphp 打造多進程異步郵件發送,今年 Mix PHP V2 發布,全面的協程支持讓我們可以使用一個進程就可達到之前多個進程都無法達到的更高 IO 性能,所以今天重寫一個協程池版本的郵件發送實例。...

    lauren_liuling 評論0 收藏0
  • Mix PHP V2 新特性:協程、定時器

    摘要:主函數查詢數據不手動釋放的連接不會歸還連接池,會在析構時丟棄執行結果為,說明是并行執行的。主函數查詢數據即便拋出了異常,仍然能執行到,沒有導致內的一直處于阻塞狀態。主函數一次性定時持續定時停止定時 協程 Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 協程技術開發,協程使用方式與 Golang 幾乎一致,包括框架封裝的協程池、連接池、命令行處理都大量參...

    Nosee 評論0 收藏0

發表評論

0條評論

wanghui

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<