亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

用異步API的原因

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

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

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

總之,異步IO或者說異步API可以算作Node的特色,因為它是收個大規(guī)模將異步IO應(yīng)用在應(yīng)用層上的平臺,它力求在單線程上將資源分配得更高效.

關(guān)于Promise

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

//結(jié)合nodejs的fs.readdir函數(shù)創(chuàng)建一個原生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('報錯為:'+err);
});

如何等待多個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);
});

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

那么問題在哪?

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

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

還有這種:

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

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

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

很多人可能會提出,這兩個限制在其他語言中一樣存在.是的,其他語言一樣存在.

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

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

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

這意味著開發(fā)的過程要考慮更多的流程控制,很遺憾,單線程體系的nodejs并不擅長這個,正是因為本質(zhì)上沒有多線程的概念,沒有鎖機(jī)制,也不可能包含通常意義上的信號量機(jī)制,結(jié)果就是工程師根本不知道什么時候去手動釋放資源.

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

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

總結(jié)

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

相關(guān)文章

最新評論