2013-07-24 104 views
1

我試圖理解和使用節點中的異步庫。我真的不明白,async.parallel函數是如何工作的。這個名字並行似乎像多線程,可以考慮下面的示例:異步困惑關於並行功能

async.parallel([ 
    function(callback){ 
     setTimeout(function(){ 
      console.log('1'); 
      callback(null, 'one'); 
     }, 200); 
    }, 
    function(callback){ 
     setTimeout(function(){ 
      console.log('2'); 
      callback(null, 'two'); 
     }, 100); 
    } 
], 
// optional callback 
function(err, results){ 
    if(err){ 
     console.log('Error'); 
    } else { 
     console.log(results); 
    } 
    // the results array will equal ['one','two'] even though 
    // the second function had a shorter timeout. 
}); 

我已經得到了結果

[ 'one', 'two' ] 

做async.parallel對多線程執行?如果沒有,名稱並行表示什麼?

回答

7

通過將這些函數放置在並行傳遞的數組中,可以確保將結果放置在數組中。請注意,您傳遞給並行的函數必須採用相同的參數。圖像被放置在這些功能中的包裝,然後調用這樣

someArrayOfFunctions[index](arguments); 

使用這種方法,異步gaurantees該獨立時平行飾面內的功能,結果被置於預期的順序在陣列中,通過使用的基於索引來填充結果的回調。具體的實現並不重要,事實是無論你什麼時候完成,各個運行的結果最終都會根據它們的函數在陣列中的位置而定,而不是基於時序。

根據你的第二個問題,async.parallel是否真正平行。不是這樣。請參考下面的例子:

var async = require('async'); 

async.parallel([ 
    function(callback){ 
     while(true);//blocking! 
    }, 
    function(callback){ 
     console.log('Not Blocked');//Never get's called 
    } 
]); 

第二個函數將永遠不會被調用。異步提供的並行幫助,正是你對你的例子感到困惑的原因。異步代碼的問題在於,有時候我們會有一些回調事件,這些回調事件在節點(磁盤I/O,網絡I/O等等)中實際上是並行的,但是這些事情最終會完成在不可預知的時間間隔。假設我們有配置數據從多個來源收集,並且不提供同步方法。我們不希望連續執行這些操作,因爲這會大大降低速度,但我們仍然希望按順序收集結果。這是async.parallel的主要用例。但是,不,async.parallel不能使異步代碼異步執行,如此阻塞示例所示。

節點中的真正並行性來自V8後端。提供這種並行性的唯一方法是發佈替代版本的節點或開發原生擴展。

+0

請告訴我async.series和async.parallel的區別。我嘗試了一個例子,但我沒有看到它的區別。 –

+0

Async.series接受一系列異步操作,並且按順序運行它們,就好像數組中的每個函數都是對它之前的函數的回調。 Async.parallel接受一系列異步操作,讓它們並行運行,並通過調用回調函數返回程序流,理想情況是利用數組中已並行填充的數據(否則爲什麼要使用它, 對?) – ChrisCM