如何从主node.js脚本运行多个node.js脚本?

问题描述:

我对node.js完全陌生。我有两个我想运行的node.js脚本。我知道我可以单独运行它们,但是我想创建一个运行这两个脚本的node.js脚本。主节点的代码应该是什么?如何从主node.js脚本运行多个node.js脚本?

+2

您可以将这两个脚本作为每个导出一个主函数的模块。你需要()'它们并且在它们每一个上执行一个主函数。 – jfriend00 2014-12-19 06:48:34

所有你需要做的是使用Node.js的模块格式,并导出模块定义为每个node.js的脚本,如:

//module1.js 
var colors = require('colors'); 

function module1() { 
    console.log('module1 started doing its job!'.red); 

    setInterval(function() { 
    console.log(('module1 timer:' + new Date().getTime()).red); 
    }, 2000); 
} 

module.exports = module1; 

//module2.js 
var colors = require('colors'); 

function module2() { 
    console.log('module2 started doing its job!'.blue); 

    setTimeout(function() { 

    setInterval(function() { 
     console.log(('module2 timer:' + new Date().getTime()).blue); 
    }, 2000); 

    }, 1000); 
} 

module.exports = module2; 

代码中的setTimeoutsetInterval仅用于向您说明两者同时工作。第一个模块被调用后,每2秒开始在控制台中记录一些内容,另一个模块首先等待一秒钟,然后每2秒开始一次。

我也使用npm colors package来允许每个模块使用其特定颜色打印其输出(以便能够在命令中首先运行npm install colors)。在此示例中,module1打印red日志,module2打印其blue中的日志。所有这些仅仅是为了向你展示如何在JavaScript和Node.js中轻松实现并发性。

在运行结束从主Node.js脚本,它在这里被命名为index.js这两个模块,你可以很容易做到:

//index.js 
var module1 = require('./module1'), 
    module2 = require('./module2'); 

module1(); 
module2(); 

并执行它想:

node ./index.js 

然后你将具有如下输出:

enter image description here

+0

如果一个模块块然后全部阻塞? – Hacketo 2014-12-19 10:34:28

+0

@Hacketo快速回答是肯定的。但关键是NodeJS不提供多线程解决方案,而NodeJS和JavaScript中的主要并发模型基于[Event Loop](https://developer.mozilla.org/en-US/docs/Web/的JavaScript /指南/事件循环)。 setTimeout和setInterval都使用这个事件循环功能来防止我们阻塞IO。更具体地说,您可以使用Web Workers来实现类似于多线程方法的解决方案,但工作人员仍然都来自单个Node进程。 – 2014-12-19 11:03:57

+0

@Hacketo在JavaScript和NodeJS领域有许多众所周知的做法,这些做法被认为是不好的,以防止我们在IO上被阻塞。在NodeJS世界中,着名的同步fs.readFile就是其中之一,并且在浏览器中同步XHR请求是阻止整个线程的另一个坏习惯。 – 2014-12-19 11:06:48

您可以使用child_process.spawn来启动每个node.js脚本。或者,child_process.fork也可能适合您的需要。

Child Process Documentation