91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

swoole中有沒有使用協程

發布時間:2022-06-17 09:58:34 來源:億速云 閱讀:157 作者:zzz 欄目:編程語言

這篇文章主要介紹“swoole中有沒有使用協程”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“swoole中有沒有使用協程”文章能幫助大家解決問題。

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

本教程操作環境: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 Swoole\Coroutine\MySQL();
    $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 Swoole\Coroutine\Redis();
    $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中有沒有使用協程”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

法库县| 滨州市| 江陵县| 正镶白旗| 宜丰县| 虎林市| 循化| 永宁县| 沂南县| 泽普县| 城口县| 扎兰屯市| 望谟县| 资兴市| 延长县| 莆田市| 蓬溪县| 宣威市| 呼图壁县| 鸡西市| 郎溪县| 登封市| 随州市| 蒙自县| 梁平县| 莱西市| 东乌珠穆沁旗| 内黄县| 扎赉特旗| 琼中| 日喀则市| 武夷山市| 西华县| 常州市| 承德县| 民勤县| 黄浦区| 小金县| 高邑县| 茂名市| 西安市|