Запуск нескольких независимых программ Node в одном экземпляре Node - PullRequest
0 голосов
/ 20 февраля 2019

Я занимаюсь встроенной разработкой в ​​системе с ограниченными ресурсами, и мне нужно запустить несколько отдельных задач Node.js (называть их task1.js, task2.js и task3.js).Очевидное решение состоит в том, чтобы запускать их отдельно, например:

$ node task1.js &
[1] 1968
$ node task2.js &
[2] 1969
$ node task3.js &
[3] 1970
$

Это работает, но в итоге я получаю три независимых стека Node, каждый из которых имеет свою собственную мегабайтную кучу, интерпретатор и т. Д. И т. Д. И т. Д. И т. Д.., который я хотел бы избежать.

Другим очевидным решением было бы объединение исходных файлов:

$ cat task1.js task2.js task3.js | node -

Это работает, но у него есть проблемы.Во-первых, все три источника задач окажутся в одном модуле, поэтому я рискну столкнуться с именами.Например, если каждый файл задачи содержит const crypto = require('crypto');, то при объединении Node будет жаловаться на многократно определенную переменную crypto.

Это также потребует, чтобы все исходные файлы первичной задачи находились в одном и том жекаталог, иначе любые относительные ссылки на пути к зависимым файлам будут рассчитываться на основе рабочего каталога по умолчанию и, скорее всего, сломаются.

Итак, я ищу способ запуска нескольких задач в одном экземпляре Node,совместное использование ресурсов Node в максимально возможной степени.

Было бы замечательно, если бы выполнялись некоторые или все следующие условия:

  • Для удобства разработки / отладки могут использоваться одни и те же taskX.js источники.используется индивидуально (как в верхней части) или запускается в одно и то же время в одном и том же экземпляре узла
  • В коде каждой задачи не требуется особой осторожности для предотвращения конфликтов пространства имен
  • Относительный путьссылки в операторах include не могут быть разрешены из одного и того же рабочего каталога, так что я мог бы получить separели исходные деревья для отдельных задач

Проблемы, которые мне не нужно решать:

  • Многопроцессорная обработка или многопоточность
  • Обмен данными между задачами
  • Межзадачные события и службы связи (если я это сделаю, я напишу их сам)
  • Защита каждой задачи от плохого поведения других

Ожидаемые ограничения длякод задачи:

  • Нет ожидания "занято", так что никто не блокирует выполнение другими
  • Нет эксклюзивного использования общих системных ресурсов (например, никакие два не откроют сокет сервера натот же порт)
  • Использование глобальных ресурсов узла будет ограничено или запрещено

1 Ответ

0 голосов
/ 21 февраля 2019

Этот ресурс ограничен 1 ЦП?Если это так, то лучше всего делать каждую задачу, возвращающую асинхронную функцию, и обрабатывать их примерно так: async.parallel .

Особенно, если ваши подзадачи разбиты в основном на асинхронные функции,это позволит задачам работать как можно более «параллельно».

В среде с несколькими процессорами вы можете повысить производительность, используя дочерние процессы (или используя кластерный модуль собственного узла).Но, как говорили другие, это потребует дополнительной памяти v8 для каждого процесса.

Если ваши задачи в основном интенсивно работают с процессором, вы не увидите большого выигрыша от async.parallel, и он может быть даже медленнеечем делать все ваши задачи синхронизации.Но если есть сетевой или дисковый доступ (IO), то параллельное использование должно быть быстрее.

...