2017-05-08 59 views
1

讓我們舉一個例子,其中我有一個巨大的數組,其元素被字符串化爲JSON。我想遍歷這個數組,並使用JSON.parse將所有字符串轉換爲JSON(這會阻止事件循環)。NodeJS:用於阻止作業的異步映射

var arr = ["{...}", "{...}", ... ]  //input array 

這裏是第一種方法(可保持阻塞一段時間事件循環):

var newArr = arr.map(function(val){ 
    try{ 
    var obj = JSON.parse(val); 
    return obj; 
    } 
    catch(err){return {};} 

}); 

第二種方法是使用async.map方法(這將是更有效的相比,第一種方法? ):

var newArr = []; 
async.map(arr, 
    function(val, done){ 
    try{ 
     var obj = JSON.parse(val); 
     done(null, obj); 
     } 
     catch(err){done(null, {});} 
    }, 
    function(err, results){ 
    if(!err) 
     newArr = results; 
    } 
); 

如果第二種方法相同或幾乎相同,那麼在node.js中這樣做的有效方式是什麼?

我碰到child processes,這會是一個很好的方法來解決這個問題嗎?

+0

「與第一種方法相比,這會有所改進嗎?」改進什麼?你想達到什麼目的? –

+0

效率是我猜想的更好的詞。用相同的編輯。 –

+0

儘管名稱不同,async並不會產生任何異步。它完全是一個編制*已經異步*任務的工具。 – Bergi

回答

1

我不認爲async.map保證同步函數的非阻塞處理。雖然它包裝你的功能與asyncify函數,我找不到任何代碼,實際上使其非阻塞。這是我已經在過去與異步遇到的問題之一(但也許它現在提高)

你可以肯定handroll與子進程自己的解決方案,但它可能是更容易使用像https://github.com/audreyt/node-webworker-threads

+1

['async']的文檔(http:// caolan。 github.io/async/index.html)聲明:_「由於性能原因,異步不會防止同步迭代」_。所以它不會自己「迭代」迭代函數。 – robertklep

+0

謝謝@robertklep顯然問題依然存在。非常奇怪,IMO。 – Creynders

+0

好吧,'async'的要點是處理_asynchronous_工作流; D如果以同步方式使用它,你根本不會使用它(雖然文檔確實顯示了一些情況,其中同步和異步代碼是混合)。 – robertklep

1

使用async.map但包裹回調setImmediate(done)

我覺得async功能相當方便,但效率不高;如果映射的計算速度非常快,則通過setImmediate只需每10次呼叫done並直接調用它,否則運行速度會明顯加快。 (setImmediate分解了調用堆棧併產生了事件循環,但setImmediate開銷不可忽略)

+0

有趣的是,直覺上就是這樣想的。 –