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

我有一个运行 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 退出,这是工作线程停止时的默认值。


我的问题:


当主进程终止时,如何在我的工作线程中执行一些清理代码?


我在上述方法的正确轨道上吗?


慕雪6442864
浏览 163回答 2
2回答

杨魅力

我主要是在这里吐痰,但我认为这会让你走上正轨:添加到 start.jsprocess.on('SIGTERM', cleanup);process.on('SIGINT', cleanup);myWorker.once('exit', stop);function cleanup() {  myWorker.postMessage('cleanup');}工人.jsconst { parentPort } = require('worker_threads');parentPort.on('message', (value) => {  if (value === 'cleanup') {    cleanup();    //then process.exit(0);  }});

白衣染霜花

以下解决方案应该有效-message在工作线程中订阅主线程事件SIGTERM在主线程中订阅(或其他)当你在主线程中捕捉到信号时,向工作线程发送一条消息,请求它清理并退出。** 不要退出主线程**。在主线程中,通过订阅exit事件等待工作线程停止。当工作线程停止时,退出主线程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript