[英]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.