2017-08-27 58 views
1

试图从父进程创建多个子进程并与它们进行通信。但我很难确定产生事件的子进程。在下面,我很惊讶地看到这些消息只来自孩子1,我希望孩子0和孩子1都会发送消息。nodejs与多个子进程通信,无法识别它们

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

UPDATE2

在消息(s)表示,孩子送到父母,它可以添加PID字段,即te2.js最后一行更改为process.send({ foo: 'bar', pid: process.pid });,我可以检查哪些子进程发送信息。

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

+0

魔术:使用'为(令i = 0; I robertklep

+0

@ robertklep,试了一下,但得到了同样的问题。 – packetie

+0

是的,我错过了'var bat = bats [i]'应该是'let bat = bats [i]'。 – robertklep

回答

1

的主要问题是变量使用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"}); 
} 
0

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

+0

谢谢@ jason-livesay,我更新了这个问题。 – packetie