2012-11-14 51 views
45

這是我的問題。我實現了一個小腳本,它執行一些繁重的計算,就像一個node.js模塊。所以,如果我輸入「node myModule.js」,它會計算一秒鐘,然後返回一個值。 現在,我想從我的主Node.JS程序中使用該模塊。我可以把所有的計算在「doSomeCalculation」功能,那麼這樣做:如何執行node.js模塊作爲node.js程序的子進程?

var myModule = require("./myModule"); 
myModule.doSomeCalculation(); 

但是,這將是阻塞,因而它會是壞的。我想以非阻塞的方式使用它,例如本地DB調用。所以我試圖使用child_process.spawn和exec,像這樣:

var spawn = require("child_process").spawn; 
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ }); 
ext.on("exit", function() { console.log("calculation over!"); }); 

但是,它不起作用。我嘗試在myModule中使用EventEmitter,發出「calculateDone」事件並嘗試在上例中的「ext」變量上添加關聯的偵聽器。仍然不起作用。

至於叉子,它們並不是我想要做的。叉子需要將計算相關的代碼放在主程序中,在父母做它所做的任何事情時分叉,分派,然後我將如何返回結果?

所以,這裏是我的問題:我可以使用子進程做一些非阻塞計算,當計算放在一個節點文件,或者它只是不可能?我應該在Python腳本中進行繁重的計算嗎?在這兩種情況下,我如何將參數傳遞給子進程 - 例如,圖像?

+7

「下午好」?這可能是早上(或更糟糕!)在其他地方:) – elmigranto

回答

105

我認爲你所追求的是child_process.fork() API。

例如,如果您有以下兩個文件:

在main.js:

var cp = require('child_process'); 
var child = cp.fork('./worker'); 

child.on('message', function(m) { 
    // Receive results from child process 
    console.log('received: ' + m); 
}); 

// Send child process some work 
child.send('Please up-case this string'); 

在worker.js:

process.on('message', function(m) { 
    // Do work (in this case just up-case the string 
    m = m.toUpperCase(); 

    // Pass results back to parent process 
    process.send(m.toUpperCase(m)); 
}); 

然後運行主(和產卵worker.js代碼的子工作者進程...)

$ node --version 
v0.8.3 

$ node main.js 
received: PLEASE UP-CASE THIS STRING 
+0

非常感謝您的答案!它現在完美。 – user1822364

+11

這個調用最好是'cp.fork(__ dirname +'/ worker');'如果你從另一個位置運行'main.js',它就會工作。 – CoDEmanX

2

無論您將作爲孩子使用什麼(Node,Python,無論),Node都不在乎。請確保您的calculcation腳本在之後退出,並且結果寫入stdout

不工作的原因是您使用的是spawn而不是exec