在同一个Node实例中运行多个独立的Node程序

时间:2019-02-20 16:55:24

标签: node.js memory limit microcontroller

我正在资源有限的系统上进行嵌入式开发,并且需要运行多个单独的Node.js任务(将它们称为task1.jstask2.jstask3.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语句中的相对路径引用不会全部从同一工作目录中解析,因此我可以为单独的任务使用单独的源树

我不需要解决的问题:

  • 多处理或多线程
  • 在任务之间共享数据
  • 任务间事件和通讯服务(如果我愿意,我自己写)
  • 保护每个任务免受他人的不良行为影响

任务代码的预期约束:

  • 没有忙碌的等待,因此没有一个阻止其他人执行
  • 不能独占使用公共系统资源(例如,没有两个将在同一端口上打开服务器套接字)
  • 将限制或禁止使用全局节点资源

1 个答案:

答案 0 :(得分:0)

此资源是否限制为1个CPU?如果是这样,那么最好的办法是使每个任务返回一个异步函数,并使用async.parallel之类的东西对其进行处理。

特别是如果您的子任务分解为大多数异步功能,这将使任务尽可能“并行”运行。

在多CPU环境中,您可以使用子进程(或使用本机节点集群模块)提高性能。但是,正如其他人所述,这将需要每个进程v8的内存开销。

如果您的任务主要是cpu密集型,那么async.parallel不会给您带来太多好处,它甚至可能比同步所有任务还要慢。但是,如果存在网络或磁盘访问(IO),则使用并行应该更快。