Я занимаюсь встроенной разработкой в системе с ограниченными ресурсами, и мне нужно запустить несколько отдельных задач 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ели исходные деревья для отдельных задач
Проблемы, которые мне не нужно решать:
- Многопроцессорная обработка или многопоточность
- Обмен данными между задачами
- Межзадачные события и службы связи (если я это сделаю, я напишу их сам)
- Защита каждой задачи от плохого поведения других
Ожидаемые ограничения длякод задачи:
- Нет ожидания "занято", так что никто не блокирует выполнение другими
- Нет эксклюзивного использования общих системных ресурсов (например, никакие два не откроют сокет сервера натот же порт)
- Использование глобальных ресурсов узла будет ограничено или запрещено