javascript - NodeJS 中将产生的线程数

标签 javascript node.js multithreading worker

我试图了解 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 });

最佳答案

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?



操作系统会处理这个。

根据操作系统,有一个名为 processor affinity 的功能。允许您手动设置任务对 CPU 内核的“亲和力”或偏好。在许多操作系统上,这只是一个提示,如果需要,操作系统会覆盖您的偏好。一些实时操作系统将此视为强制性的,允许您更好地控制硬件(在为自动驾驶汽车或工厂机器人编写算法时,您有时不希望操作系统随机控制您精心制作的软件)。

某些操作系统(如 Linux)允许您使用命令行命令设置处理器亲和性,以便您可以轻松编写 shell 脚本或使用 child_process微调你的线程。目前没有内置的方法来管理工作线程的处理器亲和性。我知道有一个第三方模块可以在 Windows 和 Linux 上执行此操作:nodeaffinity但它不适用于 Max OSX(以及其他操作系统,如 BSD、Solaris/Illumos 等)。

关于javascript - NodeJS 中将产生的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60483295/

相关文章:

angularjs - Firebase 拥有数千个 on() 事件监听器,设计良好

javascript - 有没有办法使用 Jquery Ajax 获取具有 async true 的responseText

javascript - 将Java AES加密代码移植到node.js

node.js - 我应该在哪里安装node.js?

c - OpenMP线程,如何正确使用omp原子子句?

javascript - 在node-red中实现多任务的问题

android - 慢人脸检测android

javascript - Rails 应用程序中的 Ajax 按钮不再更新

javascript - 如何访问 node.js 解析器代码?

javascript - 如何内联渲染 Backbone View ?