我有一个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群集?
答案 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');
});
}