首页 > 解决方案 > 使用 worker_threads 循环遍历 300k 个项目的数组并用 jest 运行测试

问题描述

我以前从未使用过带节点的 Workers,但我必须使用 Jest 运行一系列测试,其中包含大小为 300k+ 项的大型对象数组。

我想用这个数组的子部分运行工作人员并在每个部分上运行测试。我该怎么办?

更新:我正在使用的代码

const CPUS_NUMBER_LIMIT = os.cpus().length - 2;

const splitArray = (arr: any[]) => {
  return new Promise(async (parentResolve, parentReject) => {
    const segmentSize = Math.ceil(arr.length / CPUS_NUMBER_LIMIT);
    const segments = [];
    for (let index = 0; index < CPUS_NUMBER_LIMIT; index++) {
      const start = index * segmentSize;
      const end = start + segmentSize;
      const segment = arr.slice(start, end);
      segments.push(segment);
    }

    // Create a worker for each segment
    try {
      const results = await Promise.all(
        segments.map(
          (seg) =>
            new Promise((resolve, reject) => {
              const worker = new Worker(
                `require('ts-node/register');
                require(require('worker_threads').workerData.runThisFileInTheWorker);`,
                {
                  eval: true,
                  workerData: {
                    runThisFileInTheWorker: path.join(process.cwd(), "./src/common/dump/worker.ts"),
                    seg,
                  },
                }
              );
              worker.on("message", parentResolve);
              worker.on("error", reject);
              worker.on("exit", (code) =>
                code !== 0 ? reject(new Error("Error with code" + code)) : {}
              );
            })
        )
      );
    } catch (error) {
      parentReject(error);
    }
  });
};

标签: javascriptnode.jsjestjsworker-thread

解决方案


推荐阅读