使用NodeJS集群执行Grunt任务

时间:2015-02-02 18:04:27

标签: node.js gruntjs

我有一个Grunt任务,目前我正在使用AsyncJS来运行它。 AsyncJS运行良好,但我觉得如果我可以利用NodeJS集群来运行它,它会更强大。我已经检查了Grunt Parallel和Grunt Concurrent,它与我在Grunt任务中所做的事情没什么不同。关于利用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群集?

1 个答案:

答案 0 :(得分:1)

一种方法是使用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');
  });

}