使用 NodeJS 集群执行 Grunt 任务

Execute Grunt task using NodeJS cluster

我有一个 G运行t 任务,目前我正在使用 AsyncJS 运行 它。 AsyncJS 工作得很好,但我仍然觉得如果我可以利用 NodeJS 集群来 运行 它会更强大。我检查了 G运行t Parallel 和 G运行t Concurrent,这与我在 G运行t 任务中所做的没有太大区别。关于利用 NodeJS 集群模块加速任务执行的任何建议。

目前我是这样做的

 var queue = async.queue(task, function(task, cb){ 
     // Process task with PhantomJS and then
     cb(); 
 }, require('os').cpus().length);

 async.each(htmlPages, function(val, cb) { 
     queue.push(val, function() {
         cb();
     }); 
 }, function() {
     console.log('Completed');
     done();
 });

如何使用 NodeJS 集群使其工作?

一种方法是使用 cluster 模块产生您想要的工人数量。然后在您想让他们开始处理某事时向他们发送消息。

下面是初始化 os.cpus().length 工作人员的代码和 queue 将工作发送给他们的代码。然后它将 htmlPages 中的所有内容推送到该队列,等待它完成,然后最终杀死所有工作人员。

var os = require('os');
var async = require('async');
var cluster = require('cluster');

if (cluster.isWorker) {

  process.on('message', function(msg) {

    // Do the Phantom JS stuff

    process.send(theResult);
  });

}

if (cluster.isMaster) {

  var workers = os.cpus().map(function () {
    return cluster.fork();
  });

  var queue = async.queue(function (msg, cb) {
    var worker = workers.pop();

    worker.once('message', function (msg) {
      workers.push(worker);
      cb(null, msg);
    });

    worker.send(msg);
  }, workers.length);

  async.each(htmlPages, queue.push.bind(queue), function (err) {
    if (err) { throw err; }

    workers.forEach(function (worker) {
      worker.kill();
    });

    console.log('Completed');
  });

}