node.js - 工作代码完成后NodeJS没有代码运行
问题描述
我的工作人员代码有问题,目前我有一些代码可以扫描两个数据库表并找到一些匹配项,然后将一些数据从一个表添加到另一个创建一个新表。这是一大组数据,所以我使用工作线程来加快速度。
这一切都很好,但是一旦工作线程完成,没有其他代码运行我已经尝试在LogData
任何地方添加该函数并且它不会运行我什至添加了console.log("Finished building merge table")
并且它也不会运行。即使parentResolve
确实发生了,因为我没有看到该console.log("parentResolve")
消息。
如果有人可以帮助我,我将不胜感激。
const calculateFactorialwithWorker = async () => {
const SCCM = await ProgramDev.find({ "program name": { $not: { $regex: ".*[(]KB*[)]*" } } }).limit(8000)
const sccmLength = SCCM.length
mongoose.connection.close()
return new Promise(async (parentResolve, parentReject) => {
const numbers = [...new Array(sccmLength)].map((_, i) => i);
const segmentSize = Math.ceil(sccmLength / userCPUCount);
const segments = [];
for (let segmentIndex = 0; segmentIndex < userCPUCount; segmentIndex++) {
const start = segmentIndex * segmentSize;
const end = start + segmentSize;
const segment = numbers.slice(start, end)
segments.push(segment);
}
try {
const results = await Promise.all(
segments.map(
segment =>
new Promise((resolve, reject) => {
const worker = new Worker(workerPath, {
workerData: segment,
});
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
})
));
parentResolve(() => {
console.log("parentResolve")
})
} catch (e) {
parentReject(e)
}
});
};
calculateFactorialwithWorker().then(() => {
console.log("Finished building merge table")
LogData
})
解决方案
在工作人员事件中添加if else
块。exit
当exit
用 触发时code === 0
,没有解决/拒绝处理它。承诺不会被解决/拒绝。
参考。https://nodejs.org/api/worker_threads.html#worker_threads_event_exit
另外,我稍微重写了您的代码,因为一些承诺包装器是不必要的。
const calculateFactorialwithWorker = async () => {
try {
const SCCM = await ProgramDev.find({
"program name": { $not: { $regex: ".*[(]KB*[)]*" } },
}).limit(8000);
const sccmLength = SCCM.length;
const numbers = [...new Array(sccmLength)].map((_, i) => i);
const segmentSize = Math.ceil(sccmLength / userCPUCount);
const segments = [];
for (let segmentIndex = 0; segmentIndex < userCPUCount; segmentIndex++) {
const start = segmentIndex * segmentSize;
const end = start + segmentSize;
const segment = numbers.slice(start, end);
segments.push(segment);
}
const promises = segments.map(
segment =>
new Promise((resolve, reject) => {
const worker = new Worker(workerPath, {
workerData: segment,
});
worker.on("message", resolve);
worker.on("error", reject);
worker.on("exit", code => {
if (code !== 0) {
reject(new Error(`Worker stopped with exit code ${code}`));
} else {
resolve();
}
});
})
);
await Promise.all(promises);
} catch (err) {
throw new Error(err);
}
};
calculateFactorialwithWorker()
.then(() => {
console.log("Finished building merge table");
LogData();
})
.catch(console.log)
.finally(() => {
mongoose.connection.close();
});
推荐阅读
- python - pyautogui 没有显示我在 Pycharm 中的鼠标位置
- c# - 如何使用 It.IsAny<>(TValue) 匹配对象的某些属性?
- python - 使用python将数据发送到firebase时出错
- mysql - 如果将文本长度为 1 的 4 列更改为枚举字段,则具有多列的表是否会在插入期间提高速度?
- python - 如何使用装饰器获取类泛型类型的运行时类型?
- ios - 应用程序因文件 Swift/ContiguousArrayBuffer.swift Xcode 12、iOS 14、SwiftUI 而崩溃
- r - 使用命令“R CMD BATCH ou.txt”在 MATLAB 中调用 R
- reactjs - 在 reactjs 中将数据添加到本地存储
- android - 带有片段错误的数据绑定找不到 BindingImpl 类
- python-3.x - Traceroute IP 与 python3.8 和多处理