Используют ли асинхронные функции nodejs все ядра ЦП? - PullRequest
0 голосов
/ 15 октября 2019

Если я использую асинхронные функции или функции с обратными вызовами, такими как встроенный модуль fs, http и т. Д., Будут ли они работать по умолчанию на всех ядрах процессора?

Или все это будет использовать только одно ядро?

1 Ответ

1 голос
/ 15 октября 2019

Некоторые асинхронные операции в node.js (например, файловый ввод-вывод в модуле fs) будут использовать дополнительные потоки в процессе node.js через пул потоков в libuv. Это будет зависеть от размера вашего пула потоков и от того, какие типы операций и от вашей операционной системы хоста, сколько дополнительных процессоров будет задействовано. Это не обязательно помогает общей пропускной способности задействовать много процессоров при файловом вводе / выводе, которые все проходят через один и тот же диск, так как чтение / запись часто оказывается узким местом из-за положения головки чтения / записи на диске.

Некоторые асинхронные операции, такие как работа с сетью (например, модуль http), не являются блокирующими и асинхронными по своей природе и не выполняют свою сеть с потоками или инициируют какое-либо осмысленное использование дополнительных процессоров.

Ничто из этого не будетзапустить свой собственный Javascript в нескольких потоках, так как сам Javascript все выполняется в одном потоке.

Чтобы полностью задействовать несколько процессоров, вы можете:

  1. Поместить часть своего собственного Javascript в новый nodejs Рабочие потоки и обратная связь с основным потоком node.js посредством обмена сообщениями.
  2. Запуск собственных дочерних процессов node.js для выполнения работы в этих дочерних процессах и передачи результатов с использованием одного измножество вариантов межпроцессного взаимодействия.
  3. Используйте кластеризацию node.js, чтобычто входящие запросы могут быть разделены между доступными очередями. Для этого необходимо убедиться, что любое состояние сервера является общим для всех кластеризованных процессов (обычно хранится в некоторой базе данных, к которой могут обращаться все процессы). Это позволит отдельным запросам использовать отдельные процессоры - это не поможет одному запросу использовать больше процессоров. Для этого вам нужно будет использовать # 1 и / или # 2.
...