子进程中process无法监听退出事件 - CNode技术社区

子进程中process无法监听退出事件
发布于 6 年前 作者 ddzyan 5128 次浏览 来自 问答

问题: 主线程通过调用子进程的kill()关闭子进程,通过如下的消息监听,无法监测到退出。

master.js

const http = require("http");
const { fork } = require("child_process");
const server = http.createServer((req, res) => {
 const work = fork("./work.js");
 work.on("message", m => {
 console.log("master 接收到返回结果 :", m);
 if (typeof m === "object" && m.type === "fib") {
 work.kill();
 res.end(m.data.toString());
 }
 });
 work.on("close", (numver, signal) => {
 console.log("work 退出", numver, signal);
 });
 // 子进程收到的内容为 { type: "fib", data: "" }
 work.send({ type: "fib", data: 1 });
});
server.listen(3002, () => {
 console.log("服务启动成功");
});

work.js

console.log("子线程已经启动");
function fib(num) {
 if (num === 0) return 0;
 if (num === 1) return 1;
 return fib(num - 2) + fib(num - 1);
}
process.on("message", m => {
 console.log("work 接收到参数 :", m);
 if (typeof m === "object" && m.type === "fib") {
 const result = fib(m.data);
 process.send({ type: "fib", data: result });
 }
});
process.on("exit", function(code) {
 // TODO 这里可以主动释放其他资源 如zookeeper连接等
 if (code === 1000) {
 console.error("process:uncaughtException");
 } else if (code === 1001) {
 console.error("process:SIGINT");
 } else if (code === 1002) {
 console.error("process:SIGTERM");
 } else {
 console.error("process:unknown");
 }
});
process.on("uncaughtException", function(e) {
 console.log(e);
 // 异常可以选择不退出
 process.exit(1000);
});
process.on("SIGINT", function() {
 process.exit(1001);
});
process.on("SIGTERM", function() {
 process.exit(1002);
});
process.on("SIGHUP", () => {
 console.log("接收到退出指令");
});

控制台输出的内容如下:

服务启动成功
子线程已经启动
work 接收到参数 : { type: 'fib', data: 1 }
master 接收到返回结果 : { type: 'fib', data: 1 }
work 退出 null SIGTERM
2 回复

顶一下,别沉了

worker 才取消 experience 标记,估计尚不稳定。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /