Node.js 当我需要一个 Typescript 编译的文件时,工作线程停止并行化

Node.js worker threads stop parallelizing when I require a Typescript-compiled file

所以我的长期目标是 运行 来自“main.ts”的函数与 7 个不同的输入并行。没有共享资源,只有一个纯函数。

作为测试,我启动了一遍又一遍地执行琐碎数学运算的工作线程,并且它完美地并行化了(代码如下所示)。

但是,当我 需要 (无论如何都不是 运行)来自我应用程序主要部分的函数时,琐碎的数学运算停止并行化.

我完全不知道请求文件如何改变线程行为。有人有想法吗?我已经在下面粘贴了尽可能多的信息。

worker_thread.js

const process = require("process");

function heavyComputation(data){
  console.time(data.toString())
  let sum = 0;
  for (let i = 0; i < 100000000; i++){
    sum = Math.pow(sum,1.02) % 100000;
  }
  console.timeEnd(data.toString())
  return data + 1000;
}

process.on("message", (message) => {
  process.send({
    result: heavyComputation(1),
  });
});

worker_test.js

const child_process = require("child_process");

let workers = [];
const NUM_THREADS = 7;
let pendingResults = NUM_THREADS;

console.time("async");
function onMessage(message) {
  // console.log("Received response message:", message.result);
  pendingResults--;
  if (pendingResults == 0){
    console.timeEnd("async");
    workers.forEach(x => x.kill());
  }
}

for (let i = 0; i < NUM_THREADS; i++){
  workers[i] = child_process.fork("src/server/worker_thread.js");
  workers[i].addListener("message", onMessage);
}

for (let i = 0; i < NUM_THREADS; i++){
  workers[i].send({ data: argsData });
}

以上两个文件完全符合您的预期:

之前

1: 843.353ms
1: 837.07ms
1: 848.494ms
1: 844.644ms
1: 847.34ms
1: 855.917ms
1: 896.467ms
async: 976.024ms

但是,当我将以下内容添加到 worker_thread.js 时,一切都中断了。它导入的是我的主要打字稿文件的转译版本。

const mainApp = require("../../built/src/server/main.js");

之后

1: 846.826ms
1: 864.081ms
1: 873.927ms
1: 874.493ms
1: 921.775ms
1: 927.178ms
1: 942.86ms
async: 2.205s

请注意整个操作如何花费更长的时间,尽管每个操作花费的时间与以前相同。

main 的内容太大,无法在此处 post,但这里是构建文件顶部的一些 imports/config:

"use strict";
var __assign = (this && this.__assign) || function () {
...

Object.defineProperty(exports, "__esModule", { value: true });
exports.addTapInfoToAiParams = exports.evaluateFirstPlacements = exports.getBestMove = void 0;
var evaluator = require("./evaluator");
var aiModeManager = require("./ai_mode_manager");
var boardHelper = require("./board_helper");

所以事实证明,在我需要的文件的依赖关系树的深处,它是从硬盘读取一个大文本文件,这显着减慢了工作线程,并使多线程更难。

谜底揭晓。我怀疑很多其他人会遇到这个问题,但万一有人遇到了,希望这能为您节省一些时间。