我有一个运行 Express 服务器的 Node.js 应用程序和一个定期执行某些操作的工作线程。当服务器停止时,我需要清理到由工作线程在启动时打开的外部系统的连接。我试图在进程上为 SIGTERM 和 SIGINT 信号添加一个处理程序,但这不起作用,工作线程中的处理程序函数没有被调用,当父进程收到一个 SIGINT 或 SIGTERM 时,它立即退出,退出代码为 1,虽然父进程也有一个处理程序,它确实被调用了。这是重现问题的简单代码示例:开始.jsconst http = require("http");const express = require("express");const path = require("path");const { Worker } = require("worker_threads");let myWorker = null;process.on("SIGTERM", stop);process.on("SIGINT", stop);const app = express();const server = http.Server(app);myWorker = new Worker(path.join(__dirname, "./worker.js"));myWorker.on("exit", code => console.info(`Worker exited with code ${code}`));server.listen(3000);function stop() { console.log("Main process: stop()"); process.exit(0);}工人.jsprocess.on("SIGTERM", stop);process.on("SIGINT", stop);setInterval(() => console.log("beep"), 1000);function stop() { console.log("Worker process: stop()"); process.exit(0);}当我启动soWorker.js 时,当我用 CTRL+C 中断进程时,我会在控制台上得到这个输出:╰─➤ node start.jsbeepbeepbeep^CMain process: stop()Worker exited with code 1我期望发生的是:╰─➤ node start.jsbeepbeepbeep^CMain process: stop()Worker process: stop()Worker exited with code 0我期望stop调用工作线程中的函数,以便我可以使用它来关闭与外部系统的连接,然后以返回码 0 优雅地退出工作线程进程。相反,工作线程以代码 1 退出,这是工作线程停止时的默认值。我的问题:当主进程终止时,如何在我的工作线程中执行一些清理代码?我在上述方法的正确轨道上吗?
2 回答
![?](http://img1.sycdn.imooc.com/533e4d510001c2ad02000200-100-100.jpg)
杨魅力
TA贡献1811条经验 获得超6个赞
我主要是在这里吐痰,但我认为这会让你走上正轨:
添加到 start.js
process.on('SIGTERM', cleanup);
process.on('SIGINT', cleanup);
myWorker.once('exit', stop);
function cleanup() {
myWorker.postMessage('cleanup');
}
工人.js
const { parentPort } = require('worker_threads');
parentPort.on('message', (value) => {
if (value === 'cleanup') {
cleanup();
//then process.exit(0);
}
});
![?](http://img1.sycdn.imooc.com/533e4d660001312002000200-100-100.jpg)
白衣染霜花
TA贡献1796条经验 获得超10个赞
以下解决方案应该有效-
message
在工作线程中订阅主线程事件SIGTERM
在主线程中订阅(或其他)当你在主线程中捕捉到信号时,向工作线程发送一条消息,请求它清理并退出。** 不要退出主线程**。
在主线程中,通过订阅
exit
事件等待工作线程停止。当工作线程停止时,退出主线程。
添加回答
举报
0/150
提交
取消