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

資訊專欄INFORMATION COLUMN

基于swoole的swoolefy實現類似go的waitGroup多并發協程調度

ZweiZhao / 1415人閱讀

摘要:基于實用,抽象事件處理類,實現與底層的回調的解耦,支持協程調度,同步異步調用,全局事件注冊,心跳檢查,異步任務,多進程池等,內置等常用組件等。

swoolefy是一個基于swoole實現的輕量級高性能的常駐內存型的API和Web應用服務框架, 高度封裝了http,websocket,udp服務器,以及基于tcp實現可擴展的rpc服務, 同時支持composer包方式安裝部署項目。基于實用,swoolefy抽象Event事件處理類, 實現與底層的回調的解耦,支持協程調度,同步|異步調用,全局事件注冊,心跳檢查,異步任務,多進程(池)等, 內置view、log、session、mysql、redis、mongodb等常用組件等。

目前swoolefy4.2+版本完全支持swoole4.2.13+的協程,推薦使用swoole4.3+

GitHub:https://github.com/bingcool/s...

下面主要講解一下如何實現了類似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中調用

class GroupController extends BController {
    public function waitgroup() {
        // 創建一個waitGroup實例
        $wg = new SwoolefyCoreGoWaitGroup();
         
         // 第一種方式,直接$wg->go()函數中執行go的協程函數
        $wg->go(function() use ($wg) {
            // 掛起協程
            $fp = stream_socket_client("tcp://www.baidu.com:80", $errno, $errstr, 30);
            // 協程返回的數據
            $wg->done("mysql", "mysql");
        });

        $wg->go(function() use ($wg) {
            sleep(1);
            $wg->done("tengxun", "weixin and qq");
        });

        //掛起當前協程,等待所有任務完成后恢復
        //$result = $wg->wait();
        //這里 $result 包含了 1 個任務執行結果
        //var_dump($result);
        
        //第二種方式,添加$wg->start(),啟動協程,然后使用swoole的原生go執行協程函數
        $wg->start();
        go(function () use ($wg) {
            // 掛起協程
            sleep(1);
            $wg->done("taobao", "ali baba");
        });
        
         //第二種方式,添加$wg->start(),啟動協程,然后使用swoole的原生go執行協程函數
        $wg->start();
        go(function () use ($wg) {
            // 掛起協程
            sleep(1);
            $wg->done("baidu", "baidu");
        });
        // 以上三個協程將會并發調用,wait()函數實現等待三個協程數據返回
        //掛起當前協程,讓出cpu控制權,cpu可以做其他的事情,直到待所有任務完成后恢復
        $result = $wg->wait();
        //這里 $result 包含了 2 個任務執行結果
        var_dump($result);
    }
}

至此一個最簡單的并發調用就完成了,你可以愉快使用gowaitGroup的協程調用了

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31360.html

相關文章

  • Easyswoole 源碼學習和個人解析 目錄

    摘要:易用穩定,本次想通過對的學習和個人解析,吸收框架的思想和設計知識,加強自己對的認知和理解。當然,筆者能力水平有限,后續的文章如有錯誤,還請指出和諒解。目錄如下后續添加文章都會記錄在此服務啟動過程以及主體設計流程源碼解析 前言 swoole是什么?官網的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 ...

    CoXie 評論0 收藏0
  • PHP 協程Go + Chan + Defer

    摘要:為語言提供了強大的協程編程模式。提供的協程語法借鑒自,在此向開發組致敬協程可以與很好地互補。并發執行使用創建協程,可以讓和兩個函數變成并發執行。協程需要拿到請求的結果。 Swoole4為PHP語言提供了強大的CSP協程編程模式。底層提供了3個關鍵詞,可以方便地實現各類功能。 Swoole4提供的PHP協程語法借鑒自Golang,在此向GO開發組致敬 PHP+Swoole協程可以與...

    nidaye 評論0 收藏0
  • swoolefy-基于swoole擴展實現高性能常駐內存型API和Web應用服務框架

    摘要:是一個基于擴展實現的輕量級高性能的常駐內存型的和應用服務框架高度封裝了,,服務器,以及基于實現可擴展的服務,同時支持包方式安裝部署項目。基于實用,抽象事件處理類,實現與底層的回調的解耦,支持同步異步調用,內置等常用組件等。 swoolefy swoolefy是一個基于swoole擴展實現的輕量級高性能的常駐內存型的API和Web應用服務框架,高度封裝了http,websocket,ud...

    lewinlee 評論0 收藏0
  • PHP下用Swoole實現Actor并發模型

    摘要:協程與信箱得益于,我們可以基于的協程與快速實現一個信箱模式調度。樣例代碼比如在一個聊天室中,我們可以定義一個房間模型。 什么是Actor? Actor對于PHPer來說,可能會比較陌生,寫過Java的同學會比較熟悉,Java一直都有線程的概念(雖然PHP有Pthread,但不普及),它是一種非共享內存的并發模型,每個Actor內的數據獨立存在,Actor之間通過消息傳遞的形式進行交互調...

    GeekQiaQia 評論0 收藏0
  • 聊聊 2018 年后端技術趨勢

    摘要:現在在后端業務開發編程方面,技術力量強的團隊已經開始將技術棧從同步模式切換為異步了。使用這些技術方案是無法兼容已有程序的。影響了異步回調技術棧的普及。將會成為未來后端開發領域的主流技術方案。 今天太忙,少寫一點,后面再補充。 異步模式 Go 語言越來越熱門,很多大型互聯網公司后端正在轉向 GO 。Java 圈知名的服務化框架 Dubbo 也宣布轉型異步模式。這是一個大趨勢,異步模式已經...

    Miyang 評論0 收藏0

發表評論

0條評論

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