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

Posted

技术标签:

【中文标题】如何从主 node.js 脚本运行多个 node.js 脚本?【英文标题】:How can I run multiple node.js scripts from a main node.js scripts? 【发布时间】:2015-02-18 02:09:05 【问题描述】:

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

【问题讨论】:

你可以把这两个脚本做成模块,每个模块都导出一个主函数。你require()他们并在每一个上执行一个主函数。 【参考方案1】:

您需要做的就是使用 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 秒开始在控制台中记录一些内容,而另一个模块首先等待 1 秒,然后每 2 秒开始执行相同的操作。

我还使用了npm colors package 来允许每个模块使用其特定颜色打印其输出(以便能够首先在命令中运行npm install colors)。在此示例中,module1 打印 red 日志,module2blue 中打印其日志。这一切只是为了向您展示如何在 javascriptNode.js 中轻松实现并发。

最后从主要的Node.js 脚本运行这两个模块,这里命名为index.js,您可以轻松做到:

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

module1();
module2();

并像这样执行它:

node ./index.js

然后你会得到这样的输出:

【讨论】:

如果一个模块阻塞然后全部阻塞? @Haketo 快速回答是肯定的。但关键是 NodeJS 不提供多线程解决方案,并且 NodeJS 和 JavaScript 中的主要并发模型基于 Event Loop。 setTimeout 和 setInterval 都使用这个事件循环功能只是为了防止我们阻塞 IO。更具体地说,您可以使用 Web Workers 来实现类似于多线程方法的解决方案,但工作人员仍然来自单个 Node 进程。 @Haketo 在 JavaScript 和 NodeJS 的世界中有很多众所周知的做法被认为是不利于阻止我们阻塞 IO。在 NodeJS 世界中,著名的同步 fs.readFile 就是其中之一,而在浏览器中同步 XHR 请求是阻塞整个线程的另一种不好的做法。 @Haketo 如果对 WebWorker 解决方案感兴趣,请查看webworker-threads。【参考方案2】:

您可以使用child_process.spawn 来同时启动每个 node.js 脚本。或者,child_process.fork 也可能满足您的需求。

Child Process Documentation

【讨论】:

以上是关于如何从主 node.js 脚本运行多个 node.js 脚本?的主要内容,如果未能解决你的问题,请参考以下文章