試圖從父進程創建多個子進程並與它們進行通信。但我很難確定產生事件的子進程。在下面,我很驚訝地看到這些消息只來自孩子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 });
,我可以檢查哪些子進程發送信息。
但是,目前還不清楚如何檢測哪個子進程退出。有任何想法嗎?
魔術:使用'爲(令i = 0; I
robertklep
@ robertklep,試了一下,但得到了同樣的問題。 – packetie
是的,我錯過了'var bat = bats [i]'應該是'let bat = bats [i]'。 – robertklep