Количество потоков Рабочие в NodeJS будут порождаться - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь понять работу рабочих в NodeJS. Насколько я понимаю, каждый раз, когда мы порождаем работника, он создает новый поток с собственным экземпляром Node / V8.

Так будет ли приведенный ниже код порождать 50 потоков?

Как он распределяется по ядра процессора?

Это индекс. 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);

, а это сервис. js file

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 });

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Так будет ли приведенный ниже код порождать 50 потоков?

....

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

Да.

Как он распределяется по ядрам процессора?

Операционная система справится с этим.

В зависимости от операционной системы существует функция, называемая привязка процессора , которая позволяет вручную устанавливать «привязку» или предпочитать задачу имеет для ядра процессора. На многих ОС это всего лишь подсказка, и ОС при необходимости отменит ваши предпочтения. Некоторые операционные системы реального времени рассматривают это как обязательный, позволяя вам лучше контролировать аппаратное обеспечение (при написании алгоритмов для автомобилей с автоматическим управлением или заводских роботов вы иногда не хотите, чтобы ОС в случайные моменты времени управляла вашим тщательно созданным программным обеспечением).

Некоторые ОС, такие как Linux, позволяют вам устанавливать привязку к процессору с помощью команд командной строки, чтобы вы могли легко написать сценарий оболочки или использовать child_process для точной настройки потоков. На данный момент нет встроенного способа управления сродством процессора к рабочим потокам. Я знаю, что существует сторонний модуль, который делает это на Windows и Linux: nodeaffinity , но он не работает на Max OSX (и других ОС, таких как BSD, Solaris / Illumos). и др c.).

0 голосов
/ 02 марта 2020

См. Попытайтесь понять, что Nodejs является однопоточным, и при запуске он использует поток, поэтому число рабочих зависит от того, сколько потоков создает ваша система, и от попыток разветвления дочернего процесса больше число ваших потоков не поможет. просто замедлите весь процесс и приведите к снижению производительности.

...