gpt4 book ai didi

node.js - 如何在nodejs中监听来自worker的终止信号?

转载 作者:行者123 更新时间:2023-12-05 06:12:52 25 4
gpt4 key购买 nike

我有一个主进程,它使用 worker_threads 生成一个新线程。在某些特定情况下,主进程必须关闭该线程,而不管它是否完成了任务,因此 MainThread 使用了 terminate()。停止线程。但是,此线程会产生不同的依赖项,需要在退出前关闭这些依赖项。这些依赖项必须从线程中关闭,所以我不能使用 worker.on('exit'),因为它在主进程上运行。

有没有什么方法可以从 worker 本身监听终止?

一些我想要实现的最小示例。

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) => {...}) 向工作线程发出退出信号code>,然后在工作线程中使用process.exit()。当然要先清理。

我建议使用一个对象作为,这样您就可以将多个命令或日期从主线程传递到工作线程。

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

关于node.js - 如何在nodejs中监听来自worker的终止信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63534728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com