簡體   English   中英

Node.js非阻塞性質

[英]Node.js Non Blocking Nature

我是node.js的新手,仍在努力理解它背后的哲學。 據我所知,node.js只在一個進程中運行,而不是php,它為每個請求打開一個進程\\線程。 雖然你可以說Node對於i / o來說是“非阻塞的”,但它阻止了請求(由於每個新請求沒有新線程,所以請求堆積起來)理論上如果你編寫了一個node.js應用程序這對你遇到麻煩的每個請求都沒有快速處理。

我的問題是 - 如何判斷某個請求的處理時間是否過長,以至於它會阻止所有其他請求太長時間並阻礙我的應用程序的性能?

我知道服務器上的所有“重”動作(db查詢,文件系統搜索)都是通過回調完成的,因此不能阻塞節點。 但是,如果服務器同步完成的所有其他操作處理請求只需要太長時間呢?

例如,服務器需要在響應中寫入大量的html。 那么會發生什么?

節點程序員如何知道他是否對某個請求(以阻塞方式)做了太多,是經驗,直覺還是有關於如何做到這一點的明確指南?

關於同步代碼和異步代碼之間的限制在哪里沒有明確的指導,它更多地與應用程序流有關。 異步操作應該是首選的,因為它們允許Node.js主進程在此期間開始處理其他請求。

也就是說,簡單地為每個函數使用回調並不是一個解決方案,因為一段代碼就是這樣的:

function sum(a, b, callback){
   var sum = a + b;
   callback(sum);
}

sum(2,3, function(sum){
   console.log(sum);
}

仍然是同步的。 為了使它成為異步process.nextTick可以這樣使用:

function sum(a, b, callback){
   var sum = a + b;
   process.nextTick(function(){
     callback(sum);
   });
}

sum(2,3, function(sum){
   console.log(sum);
}

一般的經驗法則是避免同步遞歸計算,重循環和IO操作。

找出請求是否花費太長時間並因此會妨礙性能不能定義,因為限制是特定於應用程序的。 通過對應用程序運行性能測試來定位這些請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM