如何执行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
。