如何执行node.js模块作为node.js程序的subprocess?

这是我的问题。 我实现了一个小脚本,做了一些繁重的计算,就像一个node.js模块。 所以,如果我input“node myModule.js”,它会计算一秒,然后返回一个值。 现在,我想从我的主Node.JS程序中使用该模块。 我可以把所有的计算都放在“doSomeCalculation”函数中,然后:

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”variables上添加关联的侦听器。 依然不起作用。

至于叉子,他们并不是我想要做的。 叉子需要把与计算有关的代码放在主程序中,在父母做它所做的事情的时候,把孩子分叉,计算,然后我将如何返回结果?

所以这里是我的问题:我可以使用subprocess来做一些非阻塞计算,当计算放在一个节点文件,或者是不可能的? 我应该在Python脚本中进行繁重的计算吗? 在这两种情况下,我如何将parameter passing给subprocess – 例如,一个图像?

我认为你所追求的是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)); }); 

然后运行main(并为worker.js代码生成一个子工作进程)

 $ node --version v0.8.3 $ node main.js received: PLEASE UP-CASE THIS STRING 

无论你将作为一个孩子使用什么(Node,Python,不pipe),Node都不在乎。 只要确定,你的calculcation脚本完成后,结果写入stdout

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