工作代码完成后 NodeJS 没有代码 运行

NodeJS no code running after worker code finishes

我的工作人员代码有问题,目前我有一些代码可以扫描两个数据库 table 并找到一些匹配项,然后将一个 table 中的一些数据添加到其他创建一个新的 table。这是一大组数据,所以我正在使用工作线程来加快速度。

这一切工作正常但是一旦工作线程完成没有其他代码运行我已经尝试在任何地方添加函数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
})

在工人 exit 事件中添加 if else 块。当 exitcode === 0 触发时,没有 resolve/reject 来处理它。承诺不会是resolved/rejected.

参考。 https://nodejs.org/api/worker_threads.html#worker_threads_event_exit

另外,我稍微重写了你的代码,因为一些 promises 包装器是不必要的。

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