NodeJS 中将产生的线程数
Number of threads Workers in NodeJS will spawn
我正在尝试了解 NodeJS 中 worker 的工作方式。
我的理解是每次我们生成一个 worker 时,它都会创建一个带有自己 Node/V8 实例的新线程。
那么下面的代码会生成 50 个线程吗?
它是如何分布在 cpu 个核心上的?
这是index.js
const { Worker } = require("worker_threads");
var count = 0;
console.log("Start Program");
const runService = () => {
return new Promise((resolve, reject) => {
const worker = new Worker("./service.js", {});
worker.on("message", resolve);
worker.on("error", reject);
worker.on("exit", code => {
if (code != 0) {
reject(new Error("Worker has stopped"));
}
});
});
};
const run = async () => {
const result = await runService();
console.log(count++);
console.log(result);
};
for (let i = 0; i < 50; i++) {
run().catch(error => console.log(error));
}
setTimeout(() => console.log("End Program"), 2000);
这是 service.js 文件
const { workerData, parentPort } = require("worker_threads");
// You can do any heavy stuff here, in a synchronous way
// without blocking the "main thread"
const sleep = () => {
return new Promise(resolve => setTimeout(() => resolve, 500));
};
let cnt = 0;
for (let i = 0; i < 10e8; i += 1) {
cnt += 1;
}
parentPort.postMessage({ data: cnt });
请尝试了解此 Nodejs 是单线程的,并且在启动时它使用线程,因此工作人员的数量取决于您的系统创建了多少线程并尝试分叉子进程更多线程的数量将无济于事只是减慢整个过程并导致生产力下降。
So will the below code spawn 50 threads?
....
for (let i = 0; i < 50; i++) {
run().catch(error => console.log(error));
}
是的。
How is it distributed over the cpu cores?
OS 会处理这个问题。
根据 OS,有一个名为 processor affinity 的功能允许您手动设置 "affinity" 或任务对 CPU 核心的偏好。在许多 OSes 中,这只是一个提示,如果需要,OS 将覆盖您的偏好。一些实时 OSes 将此视为强制性的,允许您更好地控制硬件(在为自动驾驶汽车或工厂机器人编写算法时,您有时不希望 OS 控制您的随机精心制作的软件)。
有些 OS 像 Linux 允许您使用命令行命令设置处理器亲缘关系,这样您就可以轻松编写 shell 脚本或使用 child_process
来优化-调整你的线程。目前没有内置的方法来管理工作线程的处理器关联。我知道有一个第三方模块在 Windows 和 Linux 上执行此操作:nodeaffinity 但它不适用于 Max OSX(和其他OS像 BSD,Solaris/Illumos 等)。
我正在尝试了解 NodeJS 中 worker 的工作方式。 我的理解是每次我们生成一个 worker 时,它都会创建一个带有自己 Node/V8 实例的新线程。
那么下面的代码会生成 50 个线程吗?
它是如何分布在 cpu 个核心上的?
这是index.js
const { Worker } = require("worker_threads");
var count = 0;
console.log("Start Program");
const runService = () => {
return new Promise((resolve, reject) => {
const worker = new Worker("./service.js", {});
worker.on("message", resolve);
worker.on("error", reject);
worker.on("exit", code => {
if (code != 0) {
reject(new Error("Worker has stopped"));
}
});
});
};
const run = async () => {
const result = await runService();
console.log(count++);
console.log(result);
};
for (let i = 0; i < 50; i++) {
run().catch(error => console.log(error));
}
setTimeout(() => console.log("End Program"), 2000);
这是 service.js 文件
const { workerData, parentPort } = require("worker_threads");
// You can do any heavy stuff here, in a synchronous way
// without blocking the "main thread"
const sleep = () => {
return new Promise(resolve => setTimeout(() => resolve, 500));
};
let cnt = 0;
for (let i = 0; i < 10e8; i += 1) {
cnt += 1;
}
parentPort.postMessage({ data: cnt });
请尝试了解此 Nodejs 是单线程的,并且在启动时它使用线程,因此工作人员的数量取决于您的系统创建了多少线程并尝试分叉子进程更多线程的数量将无济于事只是减慢整个过程并导致生产力下降。
So will the below code spawn 50 threads?
.... for (let i = 0; i < 50; i++) { run().catch(error => console.log(error)); }
是的。
How is it distributed over the cpu cores?
OS 会处理这个问题。
根据 OS,有一个名为 processor affinity 的功能允许您手动设置 "affinity" 或任务对 CPU 核心的偏好。在许多 OSes 中,这只是一个提示,如果需要,OS 将覆盖您的偏好。一些实时 OSes 将此视为强制性的,允许您更好地控制硬件(在为自动驾驶汽车或工厂机器人编写算法时,您有时不希望 OS 控制您的随机精心制作的软件)。
有些 OS 像 Linux 允许您使用命令行命令设置处理器亲缘关系,这样您就可以轻松编写 shell 脚本或使用 child_process
来优化-调整你的线程。目前没有内置的方法来管理工作线程的处理器关联。我知道有一个第三方模块在 Windows 和 Linux 上执行此操作:nodeaffinity 但它不适用于 Max OSX(和其他OS像 BSD,Solaris/Illumos 等)。