尝试从父级创建多个子进程并与之通信。但是我很难识别生成事件的子进程。在下面,我很惊讶地看到这些消息只来自孩子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 });
,我可以检查哪个子进程发送消息。
但是,目前还不清楚如何检测哪个子进程退出。有什么想法吗?
答案 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
消息之前尝试添加延迟。