Javascript nodejs与多个子进程的通信,can';t识别它们

Javascript nodejs与多个子进程的通信,can';t识别它们,javascript,node.js,Javascript,Node.js,尝试从父进程创建多个子进程并与之通信。但我很难确定生成事件的子进程。在下面的示例中,我惊讶地发现消息仅来自子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"} |

尝试从父进程创建多个子进程并与之通信。但我很难确定生成事件的子进程。在下面的示例中,我惊讶地发现消息仅来自子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"});
}
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' });
更新1

检测了te2.js,因此它具有
console.log(m.msg+“|”+process.pid)
, 这有助于我确认两个子进程实际上都收到了来自父进程的消息

更新2

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


然而,如何检测哪个子进程存在尚不清楚。有什么想法吗?

可能在添加处理程序之前,您的第一个进程实际上发送了
foo
消息。在发送
foo
消息之前,可以尝试添加延迟。

主要问题是,使用
var
声明的变量的范围不在
for
块中,这意味着它们“共享”循环中
i
变量的相同实例。这就是为什么看起来这些消息来自同一个孩子

使用
let
创建适当的块作用域以修复该问题:

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"});
}

for(设i=0;图像技巧:使用
for(设i=0;i@robertklep是的,我错过了
var bat=bats[I]
也应该是
let bat=bats[I]
。你好@robertklep你的提示太棒了!你能把它写下来作为答案让我接受吗?谢谢!