2014-11-05 34 views
1

考慮以下服務器端nodejs代碼。假設裏面的代碼迴路原子(代碼應該被執行一次)和迭代之間不存在依賴關係......Nodejs服務器 - 通過使循環迭代異步來提高性能

for (var i=0; i<aVeryLargeValue; i++){ 
    //do atomic complex calculations 
} 

是否有通過使迭代異步執行將循環分成部分,以提高服務器性能的方法嗎?

+3

使事物異步不會提高計算速度。可以做什麼(如果正確完成)可以讓其他事情在長時間運行計算期間也運行。在節點中,可以運行子進程來處理計算,並在結果完成時通知主進程。 – jfriend00 2014-11-05 07:45:21

+0

我的錯誤。 Actualy我想提高服務器性能。 – 2014-11-05 07:47:15

+2

@ jfriend00是正確的 - 由於NodeJS是單線程的,因此每個循環仍然需要在同一個線程內執行,所以您不會因爲分裂而獲得任何性能提升。將大量計算放入子進程 - 這是唯一的方法。 – Charminbear 2014-11-05 07:53:13

回答

1

當然,您可以根據需要將循環分割爲多個部分,但由於開銷,總結執行時間會更加糟糕。

據我所知,沒有辦法在JavaScript中運行並行循環(分別爲node.js)。

2

你的問題似乎是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密集型的東西,那麼你最好使用子進程來處理它。上面的代碼主要適用於需要處理大量請求的時間,這可能需要幾秒鐘,但您不想在這幾秒鐘內擱置其他請求。如果您的處理時間超過幾秒鐘,那麼您應該將其卸載到子進程。