2011-04-19 60 views
14

關於「Node.js」以外的人「除代碼外所有內容都並行運行」的問題。這是一個明顯的人工例子,但讓我們說,我想創建一個包含功能factorize()其行爲如下數學庫:關於Node.js中CPU密集型代碼的混淆

var http = require('http'); 
http.createServer(function (req, res) { 
    myMath.factorize(some_big_number,function(factors) { 
    res.writeHead(200, {'Content-Type': 'application/json'}); 
    res.end(JSON.stringify(factors)); 
    } 
}).listen(8000); 

怎麼可以這樣寫,這樣它會「並行運行」?

我一直在尋找從this library解析代碼爲可能需要一些處理時間的例子。 code的主體是否被認爲是「您的代碼」,還是「並行運行」?

如果不是:我需要什麼寫factorize()時,這樣它也是非阻塞/就像一個客戶做什麼?使用EventEmitter是否足夠?

如果是這樣的話:我的最佳選擇仍然使用child processes建議在this question

道歉提前任何缺乏透明度。

+0

我沒有答案,但我理解這個問題,所以我認爲這對大多數人來說已經足夠清楚了。 :) – zneak 2011-04-19 16:48:55

+0

一個EventEmitter被阻止。 – Raynos 2011-04-19 17:12:56

回答

7

實際上,您不能在「並行」中運行它(除非您使用workers module),因爲node.js中的JavaScript在單線程中執行,但您可以將單個線程拆分爲更小的塊。例如對於process.nextTick,所以當CPU以較小的塊代替一個長的運行代碼執行代碼時,它也有小的中斷來運行其他事情。

myLongRunningCode(callback){ 
    do_a_piece_of_the_work(); 
    if(ready){ 
     callback(); 
    }else{ 
     // give the CPU a small break to do other things 
     process.nextTick(function(){ 
      // continue working 
      myLongRunningCode(callback); 
     }); 
    } 
} 
+1

我也建議在遞歸函數或循環中使用'process.nextTick',這樣可以有很多小的休息。 – Raynos 2011-04-19 17:12:32

1

所有的JS代碼不能並行運行。從來沒有同時執行多個功能。 CPU密集型代碼會使您的程序無法執行其他操作,直到此代碼結束。

我建議你用的setTimeout拆分您的代碼或在單獨的進程做你的工作。但是,這一定很密集的代碼;)

+0

他在談論服務器和響應請求,所以它並行運行。 – fazo 2011-04-19 17:03:59

+0

我知道;)那就是我的答案。它出什麼問題了? – 2011-04-19 17:06:22

3

要寫出你所要做的消息傳遞非阻塞代碼。

要執行的消息傳遞,你必須打開一個流,並通過它來傳遞消息。這涉及與其他流程交談或與子流程交談。

您可以創建子進程在節點中爲您完成繁重工作,或者您可以創建一個tcp/web服務來爲您完成繁重工作。只需讓節點向他們傳遞消息,然後在外部進程完成繁重任務時將響應的數據發送出去。