最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小結(jié)Node.js中非阻塞IO和事件循環(huán)

 更新時(shí)間:2014年09月18日 10:05:58   投稿:hebedich  
本文針對在Node.js關(guān)鍵的兩個(gè)概念:非阻塞IO和事件循環(huán)進(jìn)行了適當(dāng)?shù)目偨Y(jié),需要的朋友可以參考下

  學(xué)習(xí)和使用Node.js已經(jīng)有兩個(gè)月,使用express結(jié)合mongoose寫了一個(gè)web應(yīng)用和一套R(shí)ESTful web api,回過頭來看Node.js官網(wǎng)首頁對Node.js的介紹:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.那么其中的non-blocking I/O model 意味著什么呢?

非阻塞的IO模型

  首先,IO操作無疑是耗時(shí)的,當(dāng)服務(wù)器端接收到大量請求時(shí),為每一個(gè)請求創(chuàng)建進(jìn)程或線程的同時(shí),也增加了額外的內(nèi)存開銷,也可能浪費(fèi)更多的時(shí)間資源。

  由于Node.js是事件驅(qū)動(dòng)的,于是它使用了事件循環(huán)來解決IO操作帶來的瓶頸問題。在Node.js中,一個(gè)IO操作通常會(huì)帶有一個(gè)回調(diào)函數(shù),當(dāng)IO操作完成并返回時(shí),就會(huì)調(diào)用這個(gè)回調(diào)函數(shù),而主線程則繼續(xù)執(zhí)行接下來的代碼。簡單的用一個(gè)例子來說明這個(gè)問題:

request('http://www.google.com', function(error, response, body) {
   console.log(body);
});
 
console.log('Done!');

  這段代碼的意思是向'http://www.google.com'發(fā)出請求,當(dāng)請求返回這則調(diào)用回調(diào)函數(shù)輸出響應(yīng)信息。由于Node.js的運(yùn)行機(jī)制,這段代碼運(yùn)行后,會(huì)立即在控制臺(tái)輸出'Done!',然后一段時(shí)間后再輸出響應(yīng)的信息。

事件循環(huán) event loop

  接下來,來討論下事件循環(huán)的機(jī)制。首先說說調(diào)用桟,比如有如下一段代碼:

function A(arg, func){
  var a = arg;
 
  func();
  console.log('A');  
}
 
function B(){
  console.log('B');
}
 
A(0, B);

  當(dāng)代碼執(zhí)行后,函數(shù)A首先被推入調(diào)用桟中成為棧頂元素并開始執(zhí)行A,在執(zhí)行過程中函數(shù)B又被推入調(diào)用桟成為棧頂元素,在B執(zhí)行完成后,B被彈出調(diào)用桟,A再次成為棧頂元素,在A執(zhí)行完成后A被彈出調(diào)用桟,調(diào)用桟呈空閑狀態(tài)。

  在Javascript運(yùn)行時(shí)中存在一個(gè)消息隊(duì)列,而消息和一個(gè)回調(diào)函數(shù)相關(guān)聯(lián),當(dāng)一個(gè)事件被觸發(fā)時(shí),如果這個(gè)事件有相應(yīng)的回調(diào)函數(shù),則該消息就會(huì)被加入到消息隊(duì)列中去。

  回過頭來說事件循環(huán)到底循環(huán)的是什么,在代碼開始執(zhí)行后,函數(shù)被不斷推入調(diào)用桟中,就拿上面的例子來講,request被推入調(diào)用桟中,這個(gè)函數(shù)將進(jìn)行一個(gè)http請求(這個(gè)http請求將交由Node.js的底層模塊來實(shí)現(xiàn))同時(shí)請求完成的事件和一個(gè)回調(diào)函數(shù)關(guān)聯(lián)起來,request被彈出調(diào)用桟,console.log被推入調(diào)用桟開始執(zhí)行。當(dāng)請求完成時(shí),完成事件被觸發(fā),一條消息被添加進(jìn)消息隊(duì)列中,消息隊(duì)列首先會(huì)檢查調(diào)用桟是否為空閑狀態(tài),如果調(diào)用桟并不空閑,則會(huì)一直等待到調(diào)用桟空閑狀態(tài)后,將消息隊(duì)列的頭部彈出,此時(shí)與該消息相關(guān)聯(lián)的回調(diào)函數(shù)被執(zhí)行。

小結(jié)

  以上就無阻塞模型和事件循環(huán)在概念上進(jìn)行了總結(jié)。而這個(gè)事件循環(huán)的機(jī)制并不僅僅是Node.js所獨(dú)有的,并且Node.js的代碼是單線程執(zhí)行的,在面對大量并發(fā)請求的時(shí)候,又有著什么優(yōu)勢呢?

  上面這張圖展示了Node.js的架構(gòu)圖,Node.js的底層有一個(gè)模塊負(fù)責(zé)維護(hù)線程池,當(dāng)一個(gè)IO請求發(fā)出的時(shí)候,Node.js的底層模塊將新建一個(gè)線程來處理請求,完成后再將結(jié)果交還給上層。那么,當(dāng)有多個(gè)請求的時(shí)候,Node.js的底層模塊將利用盡可能少的線程來完成最多的任務(wù),如果存在空閑的線程,它將繼續(xù)被利用來做其他的事情,這對于前面說的針對每個(gè)請求開一個(gè)新的進(jìn)程或線程而言,無疑“聰明”許多,也更加高效了。

  這篇文章是對學(xué)習(xí)Node.js的一個(gè)總結(jié),其中若有問題和不足,歡迎批評指正。

相關(guān)文章

  • 基于websocket實(shí)現(xiàn)簡單聊天室對話

    基于websocket實(shí)現(xiàn)簡單聊天室對話

    這篇文章主要為大家詳細(xì)介紹了基于websocket實(shí)現(xiàn)簡單聊天室對話,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Node.js中使用socket創(chuàng)建私聊和公聊聊天室

    Node.js中使用socket創(chuàng)建私聊和公聊聊天室

    這篇文章主要介紹了Node.js中使用socket創(chuàng)建私聊和公聊聊天室的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • npm全局模塊卸載及默認(rèn)安裝目錄修改方法

    npm全局模塊卸載及默認(rèn)安裝目錄修改方法

    今天小編就為大家分享一篇npm全局模塊卸載及默認(rèn)安裝目錄修改方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js使用Middleware中間件教程詳解

    Node.js使用Middleware中間件教程詳解

    中間件(Middleware),特指業(yè)務(wù)流程的中間處理環(huán)節(jié),Express中間件的調(diào)用流程-當(dāng)一個(gè)請求處理時(shí),可以連續(xù)調(diào)用多個(gè)中間件,從而對這次請求進(jìn)行預(yù)處理
    2023-04-04
  • Node.js Sequelize如何實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離

    Node.js Sequelize如何實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離

    Sequelize是一個(gè)易于使用,支持多SQL方言(dialect)的對象-關(guān)系映射框架(ORM),這個(gè)庫完全采用JavaScript開發(fā)并且能夠用在Node.JS環(huán)境中。它當(dāng)前支持MySQL, MariaDB, SQLite 和 PostgreSQL 數(shù)據(jù)庫。在Node.js中,使用 Sequelize操作數(shù)據(jù)庫時(shí),同樣支持讀寫分離。
    2016-10-10
  • Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程

    Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程

    Mock.js這個(gè)JavaScript庫最常見的用法便是被用來攔截AJAX請求,well,這里我們就來看一下Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程:
    2016-05-05
  • Puppet的一些技巧

    Puppet的一些技巧

    puppet這個(gè)工具真的很神奇,先不說商業(yè)版有哪些黑科技,單是開源版本就有很多可能讓你摸不著頭腦的地方,下面來列舉一下puppet是怎么查找puppet server的
    2018-09-09
  • nodejs 生成和導(dǎo)出 word的實(shí)例代碼

    nodejs 生成和導(dǎo)出 word的實(shí)例代碼

    前段時(shí)間由于項(xiàng)目需求,得做excel和word的導(dǎo)出功能.這篇文章主要介紹了nodejs 生成和導(dǎo)出 word的實(shí)例代碼,需要的朋友可以參考下
    2018-07-07
  • Node錯(cuò)誤處理筆記之挖坑系列教程

    Node錯(cuò)誤處理筆記之挖坑系列教程

    因?yàn)閚odejs是單線程的,所以一旦發(fā)生錯(cuò)誤或異常,如果沒有及時(shí)被處理整個(gè)系統(tǒng)就會(huì)崩潰。下面這篇文章主要給大家介紹了關(guān)于Node錯(cuò)誤處理筆記之挖坑系列的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-06-06
  • nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法

    nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法

    這篇文章主要介紹了nodejs 實(shí)現(xiàn)釘釘ISV接入的加密解密方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧,需要的朋友可以參考下
    2017-01-01

最新評論

安泽县| 高邑县| 玛纳斯县| 易门县| 文水县| 普兰店市| 高唐县| 泰宁县| 万安县| 广饶县| 龙江县| 若羌县| 四子王旗| 民丰县| 乐东| 澄江县| 宁津县| 福鼎市| 宕昌县| 云南省| 肇源县| 六盘水市| 霍山县| 武威市| 眉山市| 武夷山市| 曲水县| 通州区| 舟山市| 广宁县| 门源| 天柱县| 迁西县| 林甸县| 东阿县| 连平县| 云林县| 衡东县| 襄樊市| 孟村| 房山区|