2013-09-30 97 views
1

已經有超過幾篇文章,但我仍然無法讓我的頭纏繞這個特定的問題。異步和並行處理

如果我必須打電話給三個外部站點,Facebook,Twitter和Instagram,我會用異步並行方式啓動所有三個站點,並等待Facebook響應20秒鐘,我不確定發生了什麼。這個電話是Twitter的開始,還是Instagram,它們都運行並且可能在Facebook的調用之前完成,或者整個用戶線程是否暫停,直到下一輪的事件循環,以及另一個用戶呼叫通過?它對我們來說看起來像後者。或者整個線程停下來等待?

根據請求,這裏是代碼的減少版本。 Service_requests是一組調用Facebook,Instagram和Twitter的函數。還有一些其他的東西也在這裏發生,但它的肉很簡單。

Async.parallel(service_requests, function (err, results) 
{ 
     if (err) { next(err); return; } 

     var articles = []; 

     for (var i = 0; i < results.length; i++) 
     { 
      articles = articles.concat(results[i]); 
     } 

     next(null, articles); 
}); 

回答

2

當您向服務發出並行請求時,它們都「同時發生」。因此,如果Facebook花了20秒的時間返回,Twitter花了15秒,instagram花了25秒,您將在25秒內收到所有數據。此外,當節點等待來自這些服務的響應時,它可以自由地爲其他請求提供服務。

事件循環不會停止並等待響應,如果存在其他工作,它將繼續執行其他工作。

當所有3個服務都以數據響應時,異步庫將調用您的最終回調和結果。

+0

謝謝。有時很難說出發生了什麼,因爲有很多因素。將消息打印到控制檯是有幫助的,但由於難以複製所有因素,因此不太確定我們所看到的內容。 – CargoMeister