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

深入分析node.js的異步API和其局限性

 更新時(shí)間:2016年09月05日 10:39:51   投稿:daisy  
這篇文章首先給大家介紹了為什么要用異步API,其次node.js異步api在使用過(guò)程有一些什么樣的限制呢,對(duì)于這個(gè)問(wèn)題我們下面來(lái)看看這篇關(guān)于node.js異步的介紹分析吧,有需要的可以參考借鑒。

用異步API的原因

異步的概念之所以首先在Web2.0中火起來(lái),是因?yàn)樵跒g覽器中Javascript在單線程上執(zhí)行,而且他還與UI渲染公用一個(gè)線程.這意味著Javascript在執(zhí)行的時(shí)候UI渲染和響應(yīng)是處于停滯狀態(tài)的.為了用戶體驗(yàn)更好而采取異步的方式(當(dāng)然,這在所謂的單線程語(yǔ)言中)不阻塞主線程繼續(xù)響應(yīng)用戶操作.這屬于用戶體驗(yàn)的范疇.

同樣的,如果有其他語(yǔ)言經(jīng)驗(yàn)的工程師當(dāng)然也明白,CPU在線程間切換是需要消耗大量的時(shí)間的(主要為上下文之間的切換和緩存),所以提高效率也是使用異步API的理由.

當(dāng)然,這些并不是絕對(duì)的正確,只是人人都這么說(shuō)而已.因?yàn)槿绻麆?chuàng)建多線程的開(kāi)銷小于并行執(zhí)行,那么多線程的方式是首選,這時(shí)常被認(rèn)為是CPU密集型的處理任務(wù).

總之,異步IO或者說(shuō)異步API可以算作Node的特色,因?yàn)樗鞘諅€(gè)大規(guī)模將異步IO應(yīng)用在應(yīng)用層上的平臺(tái),它力求在單線程上將資源分配得更高效.

關(guān)于Promise

這里,本文并不打算詳細(xì)講解Promise的用法,只簡(jiǎn)單說(shuō)明Promise的一些API和試用范圍:

//結(jié)合nodejs的fs.readdir函數(shù)創(chuàng)建一個(gè)原生Promise
var promiseTask = new Promise(function(resolve,reject){ 
 fs.readdir('/var/www',function(err,files){
   if(!err){
    resolve(files);
   }else{ 
    reject(err);
   }
 });
});

promiseTask.then(function(files){ 
 console.log('內(nèi)容為:'+files);
 return files; //為了接著演示其他API 這里return之后 可繼續(xù)使用then定義下一步操作函數(shù).
});
promiseTask.catch(function(err){ 
 console.log('報(bào)錯(cuò)為:'+err);
});

如何等待多個(gè)Promise完成?

//接上面
promiseTask.then(function(files){ 
 var readFilsePromiseList = files.map(function(file,index){
  return new Promise(function(resolve,reject){
   fs.readFile(file,'utf-8',function(err,str){
    if(!err){
     resolve(str)
    }
    else{
     reject(err)
    }
   });
  });
 });
 return Promise.all(readFilsePromiseList);
}).then(function(fileStrArray){
 console.log('所謂文件讀取完畢:'+fileStrArray);
});

這段代碼確實(shí)表現(xiàn)出了nodejs開(kāi)發(fā)的優(yōu)雅之處.

那么問(wèn)題在哪?

目前再優(yōu)雅的語(yǔ)言依然依托于操作系統(tǒng),也就是說(shuō),系統(tǒng)的限制依然存在:

我不知道能不能把這個(gè)錯(cuò)誤解釋成文件操作句柄耗盡,但大概意思本文希望各位能夠理解,操作系統(tǒng)并不是可以同時(shí)打開(kāi)無(wú)限多個(gè)文件.

還有這種:

這個(gè)很好理解,內(nèi)存耗盡. 當(dāng)然,內(nèi)存限制,可以通過(guò)加入以下兩個(gè)運(yùn)行參數(shù)調(diào)整:

node --max-old-space-size=8192 ./index.js #單位MB 
node --max-new-space-size=2048 ./index.js #單位KB 

上述參數(shù)在V8初始化時(shí)生效,一旦生效不可動(dòng)態(tài)變更.

很多人可能會(huì)提出,這兩個(gè)限制在其他語(yǔ)言中一樣存在.是的,其他語(yǔ)言一樣存在.

但是其他語(yǔ)言強(qiáng)大的GC或多線程的編程模型可以讓工程師們能在申請(qǐng)系統(tǒng)資源之后及時(shí)釋放.

而nodejs中雖然也可手動(dòng)釋放不需要的系統(tǒng)資源,但真的可以做到引用程序里的每一個(gè)操作都能及時(shí)釋放嗎?

舉個(gè)栗子:nodejs的redis包(npm install redis)并不提供同步的操作方法.

這意味著開(kāi)發(fā)的過(guò)程要考慮更多的流程控制,很遺憾,單線程體系的nodejs并不擅長(zhǎng)這個(gè),正是因?yàn)楸举|(zhì)上沒(méi)有多線程的概念,沒(méi)有鎖機(jī)制,也不可能包含通常意義上的信號(hào)量機(jī)制,結(jié)果就是工程師根本不知道什么時(shí)候去手動(dòng)釋放資源.

除非對(duì)自己項(xiàng)目有絕對(duì)的掌控權(quán),不使用任何使用異步API的第三方包.

所以,目前的結(jié)論就是,Promise只是一種開(kāi)發(fā)的技巧,了解這些,并不適用于所有開(kāi)發(fā)場(chǎng)景.

總結(jié)

以上就是關(guān)于node.js異步API和其局限性的全部?jī)?nèi)容,希望這篇文章對(duì)大家能有所幫助。如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • 理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理

    理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理

    本篇文章主要介紹了理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • node.js中的querystring.parse方法使用說(shuō)明

    node.js中的querystring.parse方法使用說(shuō)明

    這篇文章主要介紹了node.js中的querystring.parse方法使用說(shuō)明,本文介紹了querystring.parse的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解Nodejs mongoose

    詳解Nodejs mongoose

    Mongoose 是在nodejs環(huán)境下,對(duì)mongodb進(jìn)行便捷操作的對(duì)象模型工具。本文介紹解(翻)密(譯)Mongoose插件。這篇文章給大家詳細(xì)介紹了Nodejs mongoose 的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-06-06
  • Node.js 中 morgan 依賴及基本使用詳解

    Node.js 中 morgan 依賴及基本使用詳解

    文章介紹了Node.js中`morgan`依賴的安裝、基本使用、日志格式(如`dev`、`combined`、`common`等),以及如何自定義日志格式和將日志寫(xiě)入文件,感興趣的朋友一起看看吧
    2025-02-02
  • Nodejs中的計(jì)時(shí)器(setTimeout?setIntervals?etImmediate)使用案例解析

    Nodejs中的計(jì)時(shí)器(setTimeout?setIntervals?etImmediate)使用案例解析

    這篇文章主要介紹了Nodejs中的計(jì)時(shí)器(setTimeout?setIntervals?etImmediate)使用案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • node.js學(xué)習(xí)之事件模塊Events的使用示例

    node.js學(xué)習(xí)之事件模塊Events的使用示例

    Nodejs中不存在瀏覽器中冒泡,捕獲這些行為,Nodejs中實(shí)現(xiàn)了events這個(gè)模塊,Nodejs中大多數(shù)模塊都集成了這個(gè)模塊,所以events是Nodejs中最重要的一個(gè)模塊。這篇文章主要給大家介紹了關(guān)于node.js學(xué)習(xí)教程之事件模塊Events的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • nodejs搭建本地服務(wù)器并訪問(wèn)文件操作示例

    nodejs搭建本地服務(wù)器并訪問(wèn)文件操作示例

    這篇文章主要介紹了nodejs搭建本地服務(wù)器并訪問(wèn)文件操作,結(jié)合實(shí)例形式分析了nodejs搭建本地服務(wù)器操作步驟及文件訪問(wèn)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • node.js中的fs.fchownSync方法使用說(shuō)明

    node.js中的fs.fchownSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.fchownSync方法使用說(shuō)明,本文介紹了fs.fchownSync方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中的querystring.escape方法使用說(shuō)明

    node.js中的querystring.escape方法使用說(shuō)明

    這篇文章主要介紹了node.js中的querystring.escape方法使用說(shuō)明,本文介紹了querystring.escape的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • npm 常用命令詳解(小結(jié))

    npm 常用命令詳解(小結(jié))

    這篇文章主要介紹了npm 常用命令詳解(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

饶河县| 突泉县| 翁牛特旗| 汉源县| 武冈市| 仙桃市| 石柱| 酒泉市| 游戏| 长泰县| 天全县| 澄江县| 岫岩| 洮南市| 柳河县| 宜春市| 四会市| 高平市| 玉田县| 丰台区| 吉林市| 栾城县| 永寿县| 马龙县| 湘潭县| 甘洛县| 通州市| 五峰| 宜良县| 远安县| 景洪市| 会昌县| 平定县| 万山特区| 四川省| 张北县| 奉化市| 定结县| 石林| 西华县| 秭归县|