2017-08-27 56 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