如何将node.js模块作为node.js程序的子进程执行?

时间:2012-11-14 00:13:23

标签: node.js nonblocking

这是我的问题。作为node.js模块,我实现了一个执行大量计算的小脚本。因此,如果我输入“node myModule.js”,它会计算一秒钟,然后返回一个值。 现在,我想从我的主Node.JS程序中使用该模块。我可以将所有计算放在“doSomeCalculation”函数中,然后执行:

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

但这会阻塞,因此它会很糟糕。我想以非阻塞的方式使用它,比如本地的数据库调用。所以我尝试使用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”变量上添加关联的侦听器。仍然无效。

至于分叉,它们并不是我想要做的。 Forks需要将与计算相关的代码放在主程序中,在父进行任何操作时分叉,计算子进程,然后如何返回结果?

所以这是我的问题:当计算放在Node文件中时,我可以使用子进程进行非阻塞计算,还是只是不可能?我应该在Python脚本中进行繁重的计算吗?在这两种情况下,我如何将参数传递给子进程 - 例如,图像?

2 个答案:

答案 0 :(得分:125)

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

答案 1 :(得分:2)

你将作为一个孩子使用什么并不重要(Node,Python,等等),Node并不关心。只需确保在完成所有操作并将结果写入stdout后,您的calculcation脚本将退出

无法使用的原因是您使用的是spawn而不是exec