首页 > 解决方案 > 工作代码完成后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
})

标签: node.jsmultithreadingpromisenode-worker-threads

解决方案


在工作人员事件中添加if else块。exitexit用 触发时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();
  });



推荐阅读