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

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

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

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

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

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

        swoole中有使用協(xié)程

        什么是協(xié)程

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

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

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

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

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

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

        適用場(chǎng)景

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

        示例1:

        用戶可以通過(guò)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:

        通過(guò)協(xié)程可以并發(fā)執(zhí)行客戶端請(qǐng)求,使用到協(xié)程調(diào)度帶來(lái)的 IO 阻塞時(shí)的調(diào)度,來(lái)實(shí)現(xiàn)高性能服務(wù),下面是通過(guò) 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()]); });

        以上述代碼為例,可以簡(jiǎn)單理解為 defer 模式下, 多個(gè)客戶端的請(qǐng)求響應(yīng)是并發(fā)的,設(shè)置 setDefer(true) 后,通過(guò) 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)
        主站蜘蛛池模板: 第一福利永久视频精品| 国产午夜精品理论片免费观看| 青青青青久久精品国产h| 亚洲精品夜夜夜妓女网| 国产乱人伦偷精品视频不卡| 91精品欧美综合在线观看| 尤物yw午夜国产精品视频| 精品无人区无码乱码毛片国产| 午夜精品视频在线观看| 91精品欧美综合在线观看| 久久亚洲精品成人av无码网站| 日韩精品欧美亚洲| 精品无码国产污污污免费网站国产 | 国产成人精品男人的天堂538| 日韩精品内射视频免费观看| 亚洲国产精品丝袜在线观看| 欧美精品一区二区久久| 国产亚洲精品AA片在线观看不加载| 亚洲欧美精品伊人久久| 久久亚洲国产精品一区二区| 大桥未久在线精品视频在线| 500av大全导航精品| 2022年国产精品久久久久| 国产精品美女久久久m| 国产欧美日韩综合精品一区二区| 久久棈精品久久久久久噜噜| 欧美精品videosse精子| 亚洲av永久无码精品漫画| 无码精品黑人一区二区三区| 亚洲精品V欧洲精品V日韩精品 | 久久精品人人做人人爽电影蜜月 | 久久精品国产亚洲AV无码娇色| 精品多毛少妇人妻AV免费久久 | 最新国产精品精品视频| 日韩精品无码免费视频| 久久久久亚洲精品无码网址| 欧美精品福利在线视频| 亚洲国产精品ⅴa在线观看| 最新国产精品无码| 亚洲av午夜福利精品一区| 欧美精品v国产精品v日韩精品|