2015-09-11 21 views
1

我有一個節點程序,做了很多很重的同步的工作。需要完成的工作很容易分成幾個部分。我想利用我的機器上的所有處理器核心。這可能嗎?我可以使用子進程或羣集在節點中執行自定義函數調用嗎?

表上child processesclusters的文檔我沒有看到明顯的解決方案。子進程似乎專注於運行外部程序,集羣只能用於傳入的http連接(或者我誤解了這一點?)。

我有一個簡單的功能var output = fn(input),只是想多次運行它,將所有的呼叫傳播到我的機器上的核心,並提供回調結果。可以這樣做嗎?

回答

1

是的,子進程和集羣是實現該目標的方法。有幾種方法可以解決您的問題。

  1. 您的服務器創建一個隊列並管理該隊列。無論何時你需要調用你的函數,你都會把它放到隊列中。然後,您將一次處理隊列N個項目,其中N等於核心數量。當你開始處理時,你會產生一個子進程,可能是使用spawnexec,這個參數是另一個獨立的Node.js腳本,以及任何附加參數(它基本上只是一個命令行調用)。在該腳本中,您將完成您的工作,並將結果發回服務器。工人然後被釋放。

  2. 您可以創建集羣,所有會做的就是運行功能的專用服務器。通過cluster模塊,您可以(再次)創建N個其他工作人員,並將工作委託給這些工作人員。

現在這可能看起來像很多工作,它是。出於這個原因,你應該使用現有的庫,因爲在這一點上,這是一個解決問題的大部分。我真的很喜歡基於Redis的隊列,所以如果你對這個隊列感興趣的話,請看this answer

+0

好了,所以基本上你所要說的是,我對孩子的過程和集羣的假設是正確的,如果我想只執行一個功能來做到這一點,我需要把它放在一個獨立的腳本,我還是做一個服務器,只是執行函數調用並通過本地http請求獲取響應? –

+0

沒錯,node.js是一個單線程事件循環,並且javascript沒有線程庫。如果你想使用更多的核心,你需要額外的循環,因此通過子進程來實現額外的進程。 –

+0

我知道事件循環。我發現奇怪的是,當集羣功能被添加到節點時,它們嚴格與http服務器綁定。 –

相關問題