与多个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
块,这意味着它们在循环中“共享” i
variables的同一个实例。 这就是为什么它看起来像从同一个孩子收到的消息。
使用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
消息之前添加延迟。