为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止 Node.js 12 工作线程立即终止?

如何防止 Node.js 12 工作线程立即终止?

慕雪6442864 2021-11-18 20:46:58
我有一个运行 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 回答

?
杨魅力

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);

  }

});


查看完整回答
反对 回复 2021-11-18
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

以下解决方案应该有效-

  • message在工作线程中订阅主线程事件

  • SIGTERM在主线程中订阅(或其他)

  • 当你在主线程中捕捉到信号时,向工作线程发送一条消息,请求它清理并退出。** 不要退出主线程**。

  • 在主线程中,通过订阅exit事件等待工作线程停止。

  • 当工作线程停止时,退出主线程。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信