• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    nodejs中實現(xiàn)阻塞實例_node.js

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 21:36:03
    文檔

    nodejs中實現(xiàn)阻塞實例_node.js

    nodejs中實現(xiàn)阻塞實例_node.js:node.js中與生俱來的單線程編程、回調(diào)函數(shù)異步式風(fēng)格讓我們有時喜有時憂。先說單線程,很多人會費解于node.js的單線程如何能做到高并發(fā)?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在
    推薦度:
    導(dǎo)讀nodejs中實現(xiàn)阻塞實例_node.js:node.js中與生俱來的單線程編程、回調(diào)函數(shù)異步式風(fēng)格讓我們有時喜有時憂。先說單線程,很多人會費解于node.js的單線程如何能做到高并發(fā)?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在

    node.js中與生俱來的單線程編程、回調(diào)函數(shù)異步式風(fēng)格讓我們有時喜有時憂。先說單線程,很多人會費解于node.js的單線程如何能做到高并發(fā)?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在javascript中實現(xiàn)多線程和阻塞(本文用到的方法同樣不是通過V8引擎實現(xiàn)同步的);但對于node.js的其他方面不代表不能多線程,例如IO。如果現(xiàn)在node.js遭受大量請求,而這些請求都是IO密集型的,那么此時node每接受一個請求,在遇到耗時較長的IO操作時,javascript線程并不會一直在此等待,而是交出控制,在回調(diào)堆棧里添加IO操作完成后要執(zhí)行的操作(當(dāng)回調(diào)層級過多,訪問數(shù)量過大,大量的回調(diào)鏈可能會爆棧)。而在這段時間內(nèi),node.js又可以處理其他請求了。所以對于node.js而言,雖然javascript是單線程的,每次只能處理一個請求,但javascript處理一個請求的時間往往較短(對于IO密集型應(yīng)用而言),只要可以異步處理,那么在處理的過程中,此次請求都會釋放控制,使node.js能處理其他請求。這并發(fā)請求的同時,IO其實一直處于并發(fā)狀態(tài),減少處理請求的線程數(shù),節(jié)約資源以增加IO的線程數(shù),對于通常耗時很長的IO密集型請求來說,無疑能帶來性能上的提升。

    前面啰啰嗦嗦地一直在強(qiáng)調(diào)IO密集型,其實是在強(qiáng)調(diào)node.js的強(qiáng)項。相應(yīng)的,它的短板就是CPU密集型的請求。道理很簡單,javascript不會并發(fā),只能一個請求完成后才能處理其他請求。一個請求處理的時間越長,其他請求等待的時間越長。同一時間只會有一個請求被處理,并發(fā)性能很低。

    話說到這兒,我想申明一點:node.js不應(yīng)該被阻塞;能異步處理的方法異步處理(如使用fs.readFile(),而非fs.syncReadFile()fs.readFileSync()方法)。

    node中不能阻塞,并不代表node外不能阻塞。前面我們有講到fibers,現(xiàn)在,我們就來嘗試在fibers中實現(xiàn)阻塞。就以處理一個http請求為例吧:

    代碼如下:
    var Fiber = require('fibers');
    var http = require("http");
    Fiber(function () {
    var httpFiber = Fiber.current;
    var html = "";
    http.get("http://www.baidu.com", function (res) {
    var dataFiber = Fiber.current;
    res.on("data", function (data) {
    html += data;
    });
    res.on("end", function (data) {
    httpFiber.run();
    });
    });
    Fiber.yield();
    console.log(html);
    }).run();

    yield()、 run()這兩個方法還不了解的同學(xué),請自行查閱《fibers in node》。


    fibers的運行并不在node進(jìn)程中,所以在fibers內(nèi)部實現(xiàn)阻塞對node整體的性能并沒有影響。而且實現(xiàn)起來也是相當(dāng)容易,只需要在想阻塞的時候,把fiber yield掉。需要繼續(xù)運行,則執(zhí)行 run()恢復(fù)fiber。在上面的例子中,我們希望當(dāng)http.get請求發(fā)起時阻塞當(dāng)前程序,當(dāng)所有數(shù)據(jù)接收完成時,恢復(fù)程序。于是我們在調(diào)用http.get后使用 Fiber.yield()中斷此fiber。在對response的監(jiān)聽中,如果觸發(fā) end事件表明數(shù)據(jù)傳輸完成,于是在 end的回調(diào)函數(shù)中,調(diào)用 Fiber.current.run()恢復(fù)fiber,這樣,后續(xù)的代碼就以同步的方式拿到http.get請求的數(shù)據(jù)。

    上面的示例只是提供一種思路。如果對這種思路進(jìn)行一些抽象封裝,比如說,對有接受回調(diào)函數(shù)為參數(shù)的異步方法進(jìn)行一步柯里化,在調(diào)用后中斷,并劫持回調(diào)函數(shù),以恢復(fù)程序的代碼為回調(diào)函數(shù)。獲取異步數(shù)據(jù)后,再程序觸發(fā)預(yù)定的回調(diào)函數(shù),這樣基本能實現(xiàn)異步方法同步化。這段說得比較亂,基本上就是 fibers/future的實現(xiàn)思路,如果有興趣,請參考其源代碼。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    nodejs中實現(xiàn)阻塞實例_node.js

    nodejs中實現(xiàn)阻塞實例_node.js:node.js中與生俱來的單線程編程、回調(diào)函數(shù)異步式風(fēng)格讓我們有時喜有時憂。先說單線程,很多人會費解于node.js的單線程如何能做到高并發(fā)?這個問題不是本文重點,點到為止。澄清一點,node.js的單線程僅僅指javascript引擎是單線程的,無論如何我們沒有辦法在
    推薦度:
    標(biāo)簽: 實例 阻塞 node.js
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 99热门精品一区二区三区无码| 99免费精品视频| 国产日产韩国精品视频| 国产AⅤ精品一区二区三区久久| 久久久久久夜精品精品免费啦| 国产精品高清2021在线| 国产成人精品2021| 亚洲精品二三区| 91精品观看91久久久久久| 久久久精品2019免费观看| 精品久久久久久无码国产| 欧美高清在线精品一区| 久久99国内精品自在现线| 拍国产乱人伦偷精品视频 | 国内精品人妻无码久久久影院 | 国产精品亚洲专区在线观看| 2022国产精品最新在线| 国产精品人成在线播放新网站| 一本色道久久88综合日韩精品| 国产精品女人呻吟在线观看| 九九热精品在线| 97久久超碰国产精品2021| 久久精品人人槡人妻人人玩AV| 亚洲国产精品无码AAA片| 综合国产精品第一页| 日韩精品视频在线观看免费 | 亚洲国产另类久久久精品小说| 三级国产精品| 久久久久人妻一区精品果冻| 久久er国产精品免费观看8| 精品国产91久久久久久久a| 精品国产污污免费网站入口在线 | 亚洲欧美精品午睡沙发| 欲帝精品福利视频导航| 亚洲av午夜福利精品一区| 无码少妇精品一区二区免费动态| 中文成人无字幕乱码精品区| 人妻少妇偷人精品无码| 国产伦精品一区二区三区| 久久99久久99精品免视看动漫| 精品无码一区二区三区亚洲桃色 |