如何解决当我需要一个 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");
解决方法
所以事实证明,在我需要的文件的依赖树深处,它正在从硬盘读取一个大文本文件,这显着减慢了工作线程的速度,并使多线程变得更加困难.
谜团解开了。我怀疑很多其他人会遇到这个问题,但万一有人遇到了,希望这可以为您节省一些时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。