nodejs与多个子进程进行通信,无法识别它们

时间:2017-08-27 16:08:41

标签: javascript node.js

尝试从父级创建多个子进程并与之通信。但是我很难识别生成事件的子进程。在下面,我很惊讶地看到这些消息只来自孩子1,我曾希望孩子0和孩子1都会发送消息。

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

知道为什么吗?

$ 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), 这有助于我确认两个子进程实际上都是从父进程收到的消息。

UPDATE2

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

但是,目前还不清楚如何检测哪个子进程退出。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

主要问题是使用var声明的变量作用于for块,这意味着他们&#34;分享&#34;循环中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"});
}

答案 1 :(得分:0)

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