2017-09-25 53 views
1

我知道該節點依賴於單個事件線程。所以沒有辦法讓它有並行線程。但是async.parallel確實提供了類似並行的功能。 Stack上的另一個問題意味着async.parallel正在使用process.nextTick。所以基本上async.parallel只是一個併發函數,而不是一個真正的並行函數?Node.js async.parallel,它是平行的嗎?

回答

3

async.parallel只是讓您啓動多個異步操作,然後跟蹤它們何時完成。它們運行的​​並行程度完全取決於異步操作的內容。如果他們是網絡操作,那麼他們可能完全是並行的,因爲涉及的CPU非常少,並且處理獲取數據進出node.js進程的CPU將在node.js單線程之外處理。

您自己的處理請求結果的代碼並不真正並行運行。正如你所知道的,node.js是單線程的,所以你永遠不會有多於一個你自己的Javascript實際執行一次。但是很多操作(如網絡操作和磁盤操作)都由單個Javascript線程外的node.js處理,以便可以並行完成工作。

如果您是例如將一系列同步函數傳遞給async.parallel(如Javascript數學計算),則不會同時進行任何操作。它會運行一個完成,然後下一個等,因爲一次只能運行一塊Javascript。

async.parallel將用於Promise.all()將在基於承諾的設計中使用的相同情況。它是跟蹤多個異步操作的完成(或第一個錯誤)。

node.js中的同步操作的真正並行性通常通過集羣(多個相同的node.js進程共享負載)或自定義子進程(啓動自定義子工作者來運行某些特定操作),然後操作系統可以將多個CPU應用於不同的進程並獲得一些實際的並行性。

我知道節點依賴於單個事件線程。所以沒有辦法讓它有並行線程。

在一個node.js進程中,只運行Javascript代碼(沒有本機代碼),這是正確的。當從本地代碼實現的JavaScript中調用函數時,線程或其他進程可以由node.js在內部使用。

Stack上的另一個問題意味着async.parallel正在使用process.nextTick。

這是一個異步管理代碼常見的(這是異步庫是什麼)使用process.nextTick()強制回調總是被異步調用,如果它是使用同步和異步操作的組合,以使預測的行爲。出於同樣的原因,Promise規範要求總是在未來打勾時調用.then(),從不同步,即使承諾立即解決。

所以基本上async.parallel是stil只是一個併發功能,而不是一個真正的並行功能?

async.parallel的要點是跟蹤多個異步操作的完成。它本身不會使任何異步。您傳遞給async.parallel的操作本身將是它本身(同步或異步)的任何操作。異步庫不會改變它。