簡體   English   中英

NodeJS中的Workers將產生的線程數

[英]Number of threads Workers in NodeJS will spawn

我試圖了解 NodeJS 中工作人員的工作。 我的理解是每次我們生成一個 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 });

那么下面的代碼會產生 50 個線程嗎?

 .... for (let i = 0; i < 50; i++) { run().catch(error => console.log(error)); }

是的。

它是如何分布在 CPU 內核上的?

操作系統將處理此問題。

根據操作系統,有一個稱為處理器關聯的功能,允許您手動設置任務對 CPU 內核的“關聯”或首選項。 在許多操作系統上,這只是一個提示,如果需要,操作系統將覆蓋您的偏好。 一些實時操作系統將此視為強制性的,允許您更好地控制硬件(在為自動駕駛汽車或工廠機器人編寫算法時,您有時不希望操作系統隨機控制您精心制作的軟件)。

某些操作系統(如 Linux)允許您使用命令行命令設置處理器關聯,以便您可以輕松編寫 shell 腳本或使用child_process來微調您的線程。 目前沒有內置的方法來管理工作線程的處理器親和性。 我知道有一個第三方模塊可以在 Windows 和 Linux 上執行此操作: nodeaffinity但它不適用於 Max OSX(以及其他操作系統,如 BSD、Solaris/Illumos 等)。

請參閱嘗試了解此 Nodejs 是單線程的,並且在啟動時它使用線程,因此工作線程的數量取決於您的系統創建的線程數量,並嘗試分叉子進程更多線程的數量無濟於事,它只會減慢整個進程過程並導致生產力下降。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM