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

问题描述

所以我的长期目标是从“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 的内容太大,无法在此处发布,但这里是构建文件顶部的一些导入/配置:

"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");

解决方法

所以事实证明,在我需要的文件的依赖树深处,它正在从硬盘读取一个大文本文件,这显着减慢了工作线程的速度,并使多线程变得更加困难.

谜团解开了。我怀疑很多其他人会遇到这个问题,但万一有人遇到了,希望这可以为您节省一些时间。