考慮以下服務器端nodejs代碼。假設裏面的代碼迴路原子(代碼應該被執行一次)和迭代之間不存在依賴關係......Nodejs服務器 - 通過使循環迭代異步來提高性能
for (var i=0; i<aVeryLargeValue; i++){
//do atomic complex calculations
}
是否有通過使迭代異步執行將循環分成部分,以提高服務器性能的方法嗎?
考慮以下服務器端nodejs代碼。假設裏面的代碼迴路原子(代碼應該被執行一次)和迭代之間不存在依賴關係......Nodejs服務器 - 通過使循環迭代異步來提高性能
for (var i=0; i<aVeryLargeValue; i++){
//do atomic complex calculations
}
是否有通過使迭代異步執行將循環分成部分,以提高服務器性能的方法嗎?
當然,您可以根據需要將循環分割爲多個部分,但由於開銷,總結執行時間會更加糟糕。
據我所知,沒有辦法在JavaScript中運行並行循環(分別爲node.js)。
你的問題似乎是aVeryLargeValue
導致服務器花費太長時間來處理這個循環,因此阻止其他請求。
使用async
模塊進行處理。您可以使用whilst
函數將循環分解爲多個部分。
var async = require('async');
var aVeryLargeValue=99999;
var i=0;
async.whilst(
function() { return i < aVeryLargeValue; },
function(callback) {
for(x=i;x<i+1000;x++) {
//do something
}
i+=1000;
callback();
},
function(err) {
if(err) throw err;
}
);
如果這真的是CPU密集型的東西,那麼你最好使用子進程來處理它。上面的代碼主要適用於需要處理大量請求的時間,這可能需要幾秒鐘,但您不想在這幾秒鐘內擱置其他請求。如果您的處理時間超過幾秒鐘,那麼您應該將其卸載到子進程。
使事物異步不會提高計算速度。可以做什麼(如果正確完成)可以讓其他事情在長時間運行計算期間也運行。在節點中,可以運行子進程來處理計算,並在結果完成時通知主進程。 – jfriend00 2014-11-05 07:45:21
我的錯誤。 Actualy我想提高服務器性能。 – 2014-11-05 07:47:15
@ jfriend00是正確的 - 由於NodeJS是單線程的,因此每個循環仍然需要在同一個線程內執行,所以您不會因爲分裂而獲得任何性能提升。將大量計算放入子進程 - 這是唯一的方法。 – Charminbear 2014-11-05 07:53:13