欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          swoole中有使用協(xié)程嗎

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

          swoole中有使用協(xié)程嗎

          本教程操作環(huán)境:Windows10系統(tǒng)、Swoole4版、DELL G3電腦

          swoole中有使用協(xié)程嗎

          swoole中有使用協(xié)程

          什么是協(xié)程

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

          協(xié)程特點(diǎn)

          開發(fā)者可以無感知的用同步的代碼編寫方式達(dá)到異步 IO 的效果和性能,避免了傳統(tǒng)異步回調(diào)所帶來的離散的代碼邏輯和陷入多層回調(diào)中導(dǎo)致代碼無法維護(hù)。

          同時(shí)由于底層封裝了協(xié)程,所以對比傳統(tǒng)的 PHP 層協(xié)程框架,開發(fā)者不需要使用 yield 關(guān)鍵詞來標(biāo)識一個協(xié)程 IO 操作,所以不再需要對 yield 的語義進(jìn)行深入理解以及對每一級的調(diào)用都修改為 yield,這極大的提高了開發(fā)效率。

          協(xié)程適合 IO 密集型應(yīng)用,因?yàn)閰f(xié)程在 IO 阻塞 時(shí)會自動調(diào)度,減少 IO 阻塞導(dǎo)致的時(shí)間損失。

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

          適用場景

          高并發(fā)服務(wù),如秒殺系統(tǒng)、高性能API接口、RPC服務(wù)器,連接池,IM聊天、游戲服務(wù)器、物聯(lián)網(wǎng)、消息服務(wù)器等。

          示例1:

          用戶可以通過go函數(shù)創(chuàng)建一個協(xié)程,以達(dá)到并發(fā)執(zhí)行的效果,如下面代碼所示:

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

          每當(dāng)出現(xiàn)一個go,底層會自動創(chuàng)建一個協(xié)程,協(xié)程輸出內(nèi)容后,然后自動退出

          示例2:

          通過協(xié)程可以并發(fā)執(zhí)行客戶端請求,使用到協(xié)程調(diào)度帶來的 IO 阻塞時(shí)的調(diào)度,來實(shí)現(xiàn)高性能服務(wù),下面是通過 defer 機(jī)制實(shí)現(xiàn)請求的并發(fā)執(zhí)行:

          go(function () {     // 協(xié)程 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);          // 協(xié)程 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 模式下, 多個客戶端的請求響應(yīng)是并發(fā)的,設(shè)置 setDefer(true) 后,通過 Redis 或 MySQL 客戶端發(fā)起請求,將不再等待服務(wù)器返回結(jié)果,而是在發(fā)送請求之后,立即返回 true。在此之后可以繼續(xù)發(fā)起其他 Redis、MySQL 請求,最后再使用 recv() 方法接收響應(yīng)內(nèi)容。

          注意事項(xiàng)

          如果在多個協(xié)程間共用同一個協(xié)程客戶端,同步阻塞程序不同,協(xié)程是并發(fā)處理請求的,因此同一時(shí)間可能會有很多個請求在并行處理,一旦共用客戶端連接,就會導(dǎo)致不同協(xié)程之間發(fā)生數(shù)據(jù)錯亂。

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

          推薦學(xué)習(xí): swoole教程

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號