亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(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é)程,所以對比傳統(tǒng)的 PHP 層協(xié)程框架,開發(fā)者不需要使用 yield 關(guān)鍵詞來標(biāo)識(shí)一個(gè)協(xié)程 IO 操作,所以不再需要對 yield 的語義進(jìn)行深入理解以及對每一級(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í)行客戶端請求,使用到協(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 模式下, 多個(gè)客戶端的請求響應(yīng)是并發(fā)的,設(shè)置 setDefer(true) 后,通過 Redis 或 MySQL 客戶端發(fā)起請求,將不再等待服務(wù)器返回結(jié)果,而是在發(fā)送請求之后,立即返回 true。在此之后可以繼續(xù)發(fā)起其他 Redis、MySQL 請求,最后再使用 recv() 方法接收響應(yīng)內(nèi)容。

    注意事項(xiàng)

    如果在多個(gè)協(xié)程間共用同一個(gè)協(xié)程客戶端,同步阻塞程序不同,協(xié)程是并發(fā)處理請求的,因此同一時(shí)間可能會(huì)有很多個(gè)請求在并行處理,一旦共用客戶端連接,就會(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)