我有一个运行 Express 服务器的 Node.js 应用程序和一个定期执行某些操作的工作线程。
当服务器停止时,我需要清理到由工作线程在启动时打开的外部系统的连接。
我试图在进程上为 SIGTERM 和 SIGINT 信号添加一个处理程序,但这不起作用,工作线程中的处理程序函数没有被调用,当父进程收到一个 SIGINT 或 SIGTERM 时,它立即退出,退出代码为 1,虽然父进程也有一个处理程序,它确实被调用了。
这是重现问题的简单代码示例:
开始.js
const 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);
}
工人.js
process.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.js
beep
beep
beep
^CMain process: stop()
Worker exited with code 1
我期望发生的是:
╰─➤ node start.js
beep
beep
beep
^CMain process: stop()
Worker process: stop()
Worker exited with code 0
我期望stop调用工作线程中的函数,以便我可以使用它来关闭与外部系统的连接,然后以返回码 0 优雅地退出工作线程进程。
相反,工作线程以代码 1 退出,这是工作线程停止时的默认值。
我的问题:
当主进程终止时,如何在我的工作线程中执行一些清理代码?
我在上述方法的正确轨道上吗?
杨魅力
白衣染霜花
相关分类