如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?

Posted

技术标签:

【中文标题】如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?【英文标题】:How to pass messages as well as stdout from child to parent in node.js child process module? 【发布时间】:2016-02-02 09:35:57 【问题描述】:

我遇到了子进程模块的问题,特别是 child.spawn 和 child.fork。 我依赖 child_process.fork 的文档,其中说:

这是 child_process.spawn() 功能的一个特例 产生 Node.js 进程。除了将所有方法放在一个 普通的 ChildProcess 实例,返回的对象有通信 通道内置。有关详细信息,请参见 child.send(message, [sendHandle])。

我在下面简化了我的问题:

parent.js 是:

var cp = require('child_process');
var n = cp.fork('./child.js');
n.send(a:1);
//n.stdout.on('data',function (data) console.log(data););
n.on('message', function(m) 
  console.log("Received object in parent:");
  console.log( m);
);

child.js 是:

process.on('message', function(myObj) 
  console.log('myObj received in child:');
  console.log(myObj);
  myObj.a="Changed value";
  process.send(myObj);
);
process.stdout.write("Msg from child");

正如预期的那样。输出是:

Msg from child
myObj received in child:
 a: 1 
Received object in parent:
 a: 'Changed value' 

我希望它与 parent.js 中未注释的注释行一起使用。换句话说,我想在父进程的 n.stdout.on('data'... 语句中捕获子进程中的标准输出。如果我取消注释它,我会收到错误:

n.stdout.on('data',function (data) console.log(data););
    ^
TypeError: Cannot read property 'on' of null

我不介意使用任何子进程异步变体、exec、fork 或 spawn。有什么建议吗?

【问题讨论】:

有人可以解释一下 - 为什么在流式传输...数据时更喜欢 message 侦听器而不是 data 【参考方案1】:
spawn('stdbuf', ['-i0', '-o0', '-e0', "./test-script" ]);

【讨论】:

【参考方案2】:

在将选项对象传递给 fork() 时,您需要在选项对象上设置静默属性,以便标准输入、标准输出和标准错误通过管道返回父进程。

例如var n = cp.fork('./child.js', [], silent: true );

【讨论】:

顺便问一下,有没有办法在使用silent:true时读取这些日志并处理它们? @Kunok 根据我刚刚的尝试,您可以使用n.stdout.on('data', (data) => // do something with data )(如果您没有使用 silent: true ,您将无法使用)

以上是关于如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?的主要内容,如果未能解决你的问题,请参考以下文章

获取 node.js 中所有嵌套子进程的标准输出

node.js python子进程不会实时打印

深入Node.js的进程与子进程:从文档到实践

node之子线程child_process模块

node.js 中的 RPC 和消息队列

nodejs原理&源码赏析深度剖析cluster模块源码与node.js多进程(上)