如何解决如何在nodejs中监听来自worker的终止信号?
我有一个主进程,该主进程使用worker_threads
产生了一个新线程。在某些特定情况下,主进程必须关闭该线程,而不必关心它是否已完成其任务,因此MainThread使用terminate()来停止线程。但是,此线程产生了不同的依赖关系,需要在退出之前关闭这些依赖关系。这些依赖项必须从线程中关闭,因此我无法使用worker.on('exit')
,因为它在主进程上运行。
是否有某种方法可以监听工作人员本身的终止?
一些我想要实现的最小例子。
const {Worker,isMainThread} = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message',console.log);
worker.on('error',console.log);
worker.on('exit',console.log);
setTimeout(() => {
console.log('Worker is gonna be terminated');
worker.terminate();
},5000);
} else {
(async () => {
console.log('I am the worker');
// This thread will spawn its own dependencies,so I want to listen here the terminate signal from
// mainThread to close the dependencies of this worker
// Sth like the following will be awesome
// thread.on('exit',() => { /* close dependencies */ })
// Simulate a task which takes a larger time than MainThread wants to wait
await new Promise(resolve => {
setTimeout(resolve,10000);
});
})();
}
解决方法
您可以通过 worker.postMessage(value)
/ parentPort.on("message",(value) => {...})
向工作线程发出退出信号,然后在工作线程中使用 process.exit()
。当然要先清理。
我建议将对象用作 value
,这样您就可以将多个命令或日期从主线程传递到工作线程。
const { Worker,isMainThread,parentPort } = require("worker_threads");
if (isMainThread) {
const worker = new Worker(__filename);
worker.on("message",console.log);
worker.on("error",console.log);
worker.on("exit",console.log);
setTimeout(() => {
console.log("Worker is gonna be terminated");
// replace worker.terminate(); with something like
worker.postMessage({ exit: true });
// maybe add another setTimeout with worker.terminate() just in case?
},5000);
} else {
(async () => {
// listen for message and do things according to passed value
parentPort.on("message",(value) => {
// worker threads do not have multiple listeners available for passing different event,// therefore add one onMessage listener,and pass an object with commands/data from main thread
if (value.exit) {
// clean up
console.log("doing cleanup");
process.exit(0);
}
});
// add other logic for receiving messages from main thread
console.log("I am the worker");
// This thread will spawn its own dependencies,so I want to listen here the terminate signal from
// mainThread to close the dependencies of this worker
// Sth like the following will be awesome
// thread.on('exit',() => { /* close dependencies */ })
// Simulate a task which takes a larger time than MainThread wants to wait
await new Promise((resolve) => {
setTimeout(resolve,10000);
});
})();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。