站長資訊網
        最全最豐富的資訊網站

        swoole中有使用協程嗎

        swoole中有使用協程,協程主要用于將線程中的競爭資源轉化成協作運行;協程可以簡單理解為線程,是更加輕量級的線程,但是協程無法利用多核CPU,適用于處理IO密集型任務、高并發服務等等。

        swoole中有使用協程嗎

        本教程操作環境:Windows10系統、Swoole4版、DELL G3電腦

        swoole中有使用協程嗎

        swoole中有使用協程

        什么是協程

        協程可以簡單理解為線程,只不過這個線程是用戶態的,不需要操作系統參與,創建銷毀和切換的成本非常低,和線程不同的是協程沒法利用多核 cpu 的,想利用多核 cpu 需要依賴 Swoole 的多進程模型。

        協程特點

        開發者可以無感知的用同步的代碼編寫方式達到異步 IO 的效果和性能,避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中導致代碼無法維護。

        同時由于底層封裝了協程,所以對比傳統的 PHP 層協程框架,開發者不需要使用 yield 關鍵詞來標識一個協程 IO 操作,所以不再需要對 yield 的語義進行深入理解以及對每一級的調用都修改為 yield,這極大的提高了開發效率。

        協程適合 IO 密集型應用,因為協程在 IO 阻塞 時會自動調度,減少 IO 阻塞導致的時間損失。

        睡眠 1 萬次,讀取,寫入,檢查和刪除文件 1 萬次,使用 PDO 和 MySQLi 與數據庫通信 1 萬次,創建 TCP 服務器和多個客戶端相互通信 1 萬次,創建 UDP 服務器和多個客戶端到相互通信 1 萬次… 一切都在一個進程一秒內完美完成!

        適用場景

        高并發服務,如秒殺系統、高性能API接口、RPC服務器,連接池,IM聊天、游戲服務器、物聯網、消息服務器等。

        示例1:

        用戶可以通過go函數創建一個協程,以達到并發執行的效果,如下面代碼所示:

        go(function () {     echo "one" . PHP_EOL; }); go(function () {     echo "two" . PHP_EOL; }); go(function () {     echo "three" . PHP_EOL; });

        每當出現一個go,底層會自動創建一個協程,協程輸出內容后,然后自動退出

        示例2:

        通過協程可以并發執行客戶端請求,使用到協程調度帶來的 IO 阻塞時的調度,來實現高性能服務,下面是通過 defer 機制實現請求的并發執行:

        go(function () {     // 協程 MySQL 客戶端     $mysql = new SwooleCoroutineMySQL();     $mysql->connect([         'host' => '172.17.0.1',         'user' => 'root',         'password' => 'root',         'database' => 'swoole',     ]);     $mysql->setDefer();     $mysql->query('select sleep(2);');           print_r("time1: " . time() . PHP_EOL);          // 協程 Redis 客戶端     $redis = new SwooleCoroutineRedis();     $redis->connect('172.17.0.1', 6379);     $redis->setDefer();     $redis->set('name', '張三');     $redis->recv();          print_r("time2: " . time() . PHP_EOL);     $redis->setDefer();     $redis->get('name');     $res1 = $mysql->recv();     $res2 = $redis->recv();     print_r(['result1: ' => $res1[0]['sleep'], 'result2: ' => $res2, 'time3: ' => time()]); });

        以上述代碼為例,可以簡單理解為 defer 模式下, 多個客戶端的請求響應是并發的,設置 setDefer(true) 后,通過 Redis 或 MySQL 客戶端發起請求,將不再等待服務器返回結果,而是在發送請求之后,立即返回 true。在此之后可以繼續發起其他 Redis、MySQL 請求,最后再使用 recv() 方法接收響應內容。

        注意事項

        如果在多個協程間共用同一個協程客戶端,同步阻塞程序不同,協程是并發處理請求的,因此同一時間可能會有很多個請求在并行處理,一旦共用客戶端連接,就會導致不同協程之間發生數據錯亂。

        協程使得原有的異步邏輯同步化,但是在協程的切換是隱式發生的,所以在協程切換的前后不能保證全局變量以及static變量的一致性。

        推薦學習: swoole教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 69久久精品无码一区二区| 久久99精品综合国产首页| 国产精品丝袜一区二区三区 | 国产成人精品亚洲日本在线| 精品国产福利尤物免费| www国产精品| 熟女精品视频一区二区三区| 国精品无码A区一区二区| 87国产私拍福利精品视频| 国产精品嫩草影院AV| 亚洲精品国产精品乱码在线观看| 精品欧美一区二区三区久久久 | 无码精品日韩中文字幕| 精品亚洲一区二区三区在线播放| 久久精品国内一区二区三区| 精品黑人一区二区三区| 亚洲精品无码久久久久sm| 欧美激情精品久久久久久| 国产精品亚洲二区在线观看| 88久久精品无码一区二区毛片 | 人妻偷人精品成人AV| 国产欧美在线观看精品一区二区| 亚洲国产精品欧美日韩一区二区| 国产精品999| 成人国内精品久久久久影院| 国产精品毛片无遮挡| 国产福利精品一区二区| 精品免费人成视频app| 人妻少妇精品中文字幕AV| 亚洲精品成人片在线播放 | 四虎成人www国产精品| 精品视频在线v| 久久精品一区二区三区不卡| 欧美黑人巨大精品| 国产成人精品曰本亚洲79ren| 91精品国产91久久久久久青草 | 99久久精品无码一区二区毛片 | 亚洲国产精品无码久久| 亚洲av午夜成人片精品网站| 日韩人妻无码精品久久久不卡 | 国产精品福利一区二区久久|