欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年09月18日 10:05:58   投稿:hebedich  
本文針對(duì)在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寫(xiě)了一個(gè)web應(yīng)用和一套R(shí)ESTful web api,回過(guò)頭來(lái)看Node.js官網(wǎng)首頁(yè)對(duì)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操作無(wú)疑是耗時(shí)的,當(dāng)服務(wù)器端接收到大量請(qǐng)求時(shí),為每一個(gè)請(qǐng)求創(chuàng)建進(jìn)程或線程的同時(shí),也增加了額外的內(nèi)存開(kāi)銷,也可能浪費(fèi)更多的時(shí)間資源。

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

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

  這段代碼的意思是向'http://www.google.com'發(fā)出請(qǐng)求,當(dāng)請(qǐ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

  接下來(lái),來(lái)討論下事件循環(huán)的機(jī)制。首先說(shuō)說(shuō)調(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)用桟中成為棧頂元素并開(kāi)始執(zhí)行A,在執(zhí)行過(guò)程中函數(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ì)列中去。

  回過(guò)頭來(lái)說(shuō)事件循環(huán)到底循環(huán)的是什么,在代碼開(kāi)始執(zhí)行后,函數(shù)被不斷推入調(diào)用桟中,就拿上面的例子來(lái)講,request被推入調(diào)用桟中,這個(gè)函數(shù)將進(jìn)行一個(gè)http請(qǐng)求(這個(gè)http請(qǐng)求將交由Node.js的底層模塊來(lái)實(shí)現(xiàn))同時(shí)請(qǐng)求完成的事件和一個(gè)回調(diào)函數(shù)關(guān)聯(lián)起來(lái),request被彈出調(diào)用桟,console.log被推入調(diào)用桟開(kāi)始執(zhí)行。當(dāng)請(qǐ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é)

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

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

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

相關(guān)文章

  • Node.js中process模塊常用的屬性和方法

    Node.js中process模塊常用的屬性和方法

    Node.js中的process模塊用來(lái)與當(dāng)前進(jìn)程互動(dòng),可以通過(guò)全局變量process訪問(wèn),不必使用require命令加載。它是一個(gè)EventEmitter對(duì)象的實(shí)例。下面這篇文章給大家介紹了Node.js中process模塊常用的屬性和方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • 利用forever和pm2部署node.js項(xiàng)目過(guò)程

    利用forever和pm2部署node.js項(xiàng)目過(guò)程

    這篇文章主要給大家介紹了如何利用forever和pm2部署node.js項(xiàng)目的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼供大家參考學(xué)習(xí),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編一起來(lái)看看吧。
    2017-05-05
  • NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    這篇文章主要介紹了NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法,簡(jiǎn)單講述了不可逆加密與密碼密文保存的原理并結(jié)合實(shí)例形式分析了nodejs相關(guān)加密操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-03-03
  • Node.js中,在cmd界面,進(jìn)入退出Node.js運(yùn)行環(huán)境的方法

    Node.js中,在cmd界面,進(jìn)入退出Node.js運(yùn)行環(huán)境的方法

    今天小編就為大家分享一篇Node.js中,在cmd界面,進(jìn)入退出Node.js運(yùn)行環(huán)境的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 使用Jasmine和Karma對(duì)AngularJS頁(yè)面程序進(jìn)行測(cè)試

    使用Jasmine和Karma對(duì)AngularJS頁(yè)面程序進(jìn)行測(cè)試

    這篇文章主要介紹了使用Jasmine和Karma對(duì)AngularJS頁(yè)面程序進(jìn)行測(cè)試的方法,以Node.js為環(huán)境,非常適合JavaScript的全棧開(kāi)發(fā)時(shí)使用,需要的朋友可以參考下
    2016-03-03
  • Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格

    Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格

    這篇文章主要為大家詳細(xì)介紹了Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格的具體實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • node使用mysql獲取數(shù)據(jù)庫(kù)數(shù)據(jù)中文亂碼問(wèn)題的解決

    node使用mysql獲取數(shù)據(jù)庫(kù)數(shù)據(jù)中文亂碼問(wèn)題的解決

    這篇文章主要介紹了node使用mysql獲取數(shù)據(jù)庫(kù)數(shù)據(jù)中文亂碼問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command failed問(wèn)題的解決方法

    用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command

    在用npm install時(shí)報(bào)錯(cuò)npm ERR! path D:…\node-sass和npm ERR! command failed 問(wèn)題,本文給大家介紹了如何解決這個(gè)問(wèn)題,文中通過(guò)圖文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • React+react-dropzone+node.js實(shí)現(xiàn)圖片上傳的示例代碼

    React+react-dropzone+node.js實(shí)現(xiàn)圖片上傳的示例代碼

    本篇文章主要介紹了React+react-dropzone+node.js實(shí)現(xiàn)圖片上傳的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-08-08
  • Node.js API詳解之 os模塊用法實(shí)例分析

    Node.js API詳解之 os模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 os模塊用法,結(jié)合實(shí)例形式分析了Node.js API中os模塊基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05

最新評(píng)論