与多个subprocess的nodejs通信无法识别它们

试图从父母创build多个subprocess,并与他们沟通。 但是我很难识别产生事件的subprocess。 在下面,我很惊讶地看到信息只来自孩子1,我希望孩子0和孩子1都会发送信息。

Ubuntu 14.04上的这个nodejs(v8.4.0)。

任何想法为什么?

$ node te1.js got msg from child: 1 {"foo":"bar"} got msg from child: 1 {"foo":"bar"} hi you| hi you| CHILD got message: {"msg":"hi you"} | CHILD got message: {"msg":"hi you"} | 

===== te1.js ==================

 const cp = require('child_process'); var bats = []; bats.push(cp.fork(`${__dirname}/te2.js`)); bats.push(cp.fork(`${__dirname}/te2.js`)); for (i=0; i<bats.length; i++) { bats[i]._id = i; var bat = bats[i] bat.on('message', function(resp) { console.log("got msg from child: " + bat._id + " " + JSON.stringify(resp)); }) bat.on('exit', function(code) { console.log("child " + bat._id + " proc exited") }) bat.send({msg: "hi you"}); } 

======= te2.js ===================

 process.on('message', (m) => { console.log(m.msg + "|") console.log('CHILD got message:', JSON.stringify(m), "|"); if (m.msg == "exit") { console.log("exiting...") process.exit() } }); process.send({ foo: 'bar' }); 

UPDATE1

检测te2.js所以它有console.log(m.msg + "|" + process.pid) ,这有助于我确认这两个subprocess实际上是从父进程收到的消息。

UPDATE2

在子节点发送给父节点的消息中,可以添加一个PID字段,即将te2.js中的最后一行改为process.send({ foo: 'bar', pid: process.pid }); ,我可以检查哪个subprocess发送消息。

但是,目前还不清楚如何检测哪个subprocess退出。 有任何想法吗?

主要的问题是,使用var声明的variables没有作用于for块,这意味着它们在循环中“共享” ivariables的同一个实例。 这就是为什么它看起来像从同一个孩子收到的消息。

使用let创build一个适当的块范围来解决这个问题:

 for (let i=0; i<bats.length; i++) { // <-- here bats[i]._id = i; let bat = bats[i] // <-- and also here bat.on('message', function(resp) { console.log("got msg from child: " + bat._id + " " + JSON.stringify(resp)); }) bat.on('exit', function(code) { console.log("child " + bat._id + " proc exited") }) bat.send({msg: "hi you"}); } 

也许你的第一个进程在添加处理程序之前实际上发送了foo消息。 也许尝试在发送foo消息之前添加延迟。