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

Posted

技术标签:

【中文标题】如何将 node.js 模块作为 node.js 程序的子进程执行?【英文标题】:How can I execute a node.js module as a child process of a node.js program? 【发布时间】:2012-11-02 11:51:24 【问题描述】:

这是我的问题。我实现了一个小脚本,它做一些繁重的计算,作为一个 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,发出“calculationDone”事件并尝试在上面示例中的“ext”变量上添加关联的侦听器。还是不行。

至于分叉,它们并不是我真正想要做的。 Forks 需要将计算相关的代码放在主程序中,fork,在 child 中进行计算,而 parent 做任何事情,然后我将如何返回结果?

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

【问题讨论】:

“下午好”?可能是早上(甚至更糟!)其他地方:) 【参考方案1】:

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

【讨论】:

如果您从其他位置运行main.js,则调用最好是cp.fork(__dirname + '/worker');【参考方案2】:

不管你小时候使用什么(Node、Python 等等),Node 都不在乎。只需确保您的计算脚本在一切完成并将结果写入stdout 后退出。

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

【讨论】:

以上是关于如何将 node.js 模块作为 node.js 程序的子进程执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 node.js 模块导入 node.js 模块

如何在 node.js 中卸载具有开发依赖项的 npm 模块?

如何从 Node.js IMAP 模块中的正文获取纯文本

如何在 node.js 中生成 PDF

如何在 node.js 中包含默认模型作为参考名称?

如何自动更新所有 Node.js 模块?