久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

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

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

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

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

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

      swoole中有使用協(xié)程

      什么是協(xié)程

      協(xié)程可以簡單理解為線程,只不過這個(gè)線程是用戶態(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é)程,所以對(duì)比傳統(tǒng)的 PHP 層協(xié)程框架,開發(fā)者不需要使用 yield 關(guān)鍵詞來標(biāo)識(shí)一個(gè)協(xié)程 IO 操作,所以不再需要對(duì) yield 的語義進(jìn)行深入理解以及對(duì)每一級(jí)的調(diào)用都修改為 yield,這極大的提高了開發(fā)效率。

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

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

      適用場景

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

      示例1:

      用戶可以通過go函數(shù)創(chuàng)建一個(gè)協(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)一個(gè)go,底層會(huì)自動(dòng)創(chuàng)建一個(gè)協(xié)程,協(xié)程輸出內(nèi)容后,然后自動(dòng)退出

      示例2:

      通過協(xié)程可以并發(fā)執(zhí)行客戶端請(qǐng)求,使用到協(xié)程調(diào)度帶來的 IO 阻塞時(shí)的調(diào)度,來實(shí)現(xiàn)高性能服務(wù),下面是通過 defer 機(jī)制實(shí)現(xiàn)請(qǐng)求的并發(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 模式下, 多個(gè)客戶端的請(qǐng)求響應(yīng)是并發(fā)的,設(shè)置 setDefer(true) 后,通過 Redis 或 MySQL 客戶端發(fā)起請(qǐng)求,將不再等待服務(wù)器返回結(jié)果,而是在發(fā)送請(qǐng)求之后,立即返回 true。在此之后可以繼續(xù)發(fā)起其他 Redis、MySQL 請(qǐng)求,最后再使用 recv() 方法接收響應(yīng)內(nèi)容。

      注意事項(xiàng)

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

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

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

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