我正在资源有限的系统上进行嵌入式开发,并且需要运行多个单独的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
语句中的相对路径引用不会全部从同一工作目录中解析,因此我可以为单独的任务使用单独的源树我不需要解决的问题:
任务代码的预期约束:
答案 0 :(得分:0)
此资源是否限制为1个CPU?如果是这样,那么最好的办法是使每个任务返回一个异步函数,并使用async.parallel之类的东西对其进行处理。
特别是如果您的子任务分解为大多数异步功能,这将使任务尽可能“并行”运行。
在多CPU环境中,您可以使用子进程(或使用本机节点集群模块)提高性能。但是,正如其他人所述,这将需要每个进程v8的内存开销。
如果您的任务主要是cpu密集型,那么async.parallel不会给您带来太多好处,它甚至可能比同步所有任务还要慢。但是,如果存在网络或磁盘访问(IO),则使用并行应该更快。