子进程没有收到消息

时间:2015-04-08 02:02:49

标签: javascript node.js

我不确定这里发生了什么,但是当我使用fork启动以下过程时,我的主进程会输出Child process " + cid + " running,但当我尝试向子进程发送消息"Child process " + data时输出。我也不确定为什么。

这是子进程:

var running = true;
var cid = process.env.cid;

process.on("message", function(data){
    data = (data + "").trim().toLowerCase();
    process.send("Child process " + data);
});

process.send({cid: cid, msg: "Child process " + cid + " running"});

while(running){

}

process.send("Child stopped!");

我是这样开始孩子的:

var children = [];
for(var i = 0; i < 5; i++){
    children[i] = cp.fork("./child.js", [], {
//        silent: true,
        cwd: __dirname,
        env: {
            cid: i
        }
    });
    children[i].on("message", function(msg){
        console.log("Message from " + msg.cid + ": " + msg.msg);
    });
}

然后我发送这样的消息:

for(var i in children){
    console.log("    Sending message to child " + i);
    children[i].send("msg");
}

当我运行server.js时,我得到了这个输出:

Message from 1: Child process 1 running
Message from 0: Child process 0 running
Message from 2: Child process 2 running
Message from 3: Child process 3 running
Message from 4: Child process 4 running
    Sending message to child 0
    Sending message to child 1
    Sending message to child 2
    Sending message to child 3
    Sending message to child 4

但他们似乎没有回应任何事情。

我没有收到错误,也没有来自子进程的输出。造成这种情况的原因是什么?

2 个答案:

答案 0 :(得分:1)

您可以删除无限循环,除非您明确调用process.exit()

,否则子节点不应在有活动事件侦听器时退出

不是告诉子进程以过程样式在最后一行结束,而是在退出时使用事件样式:

process.on('exit', function(code) {
    process.send("Child stopped!");
});

process docs

ChildProcess docs

由于事件仅在进程空闲时处理,因为javascript不实现线程。因此,while循环将阻止进程,阻止其接收消息。

答案 1 :(得分:0)

while(running){

}

这个块是原因,它将永远运行,并且它将在子项生成后立即运行,因此子进程将永远在该循环中被触发,没有时间处理下一行 process.send("Child stopped!");process.on("message",...