2015-02-02 3 views
2

저는 Grunt 작업이 있으며 현재 AsyncJS를 사용하여이를 실행하고 있습니다. AsyncJS는 잘 작동했지만 노드 JS 클러스터를 사용하면 더 강력해질 수 있다고 생각합니다. Grunt Parallel과 Grunt Concurrent를 체크 아웃했는데 Grunt 작업에서 내가하는 것과별로 다르지 않습니다. NodeJS 클러스터 모듈을 활용하여 작업 실행 속도를 높이기위한 제안 사항. NodeJS 클러스터를 사용하여 GPT를 실행하십시오.

현재 내가 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(); 
}); 

같은 뭐하는 거지?

답변

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'); 
    }); 

} 
+0

감사합니다. 나는 거의 잃어버린 희망을 가지고있었습니다 :) 이것을 시도하고 알려 드리겠습니다. – redV

+0

Grunt 작업으로 코드를 실행하려고 시도했지만 코드는 다음과 같습니다. http://pastie.org/9900139#. 그러나 동일한 작업이 여러 번 실행되는 것 같습니다. 내 관찰이 맞습니까? – redV

+0

그 이유는'cluster.fork()'를 실행할 때 새로운 포크가 파일의 맨 위에 들어가서 모든 것을 다시 실행하기 때문입니다. 파일의 맨 위에'isWorker' 및/또는'isMaster'를 넣어야합니다. 나는 당신을 위해 파일을 고쳤고 버전 기록을 보시라 : https://gist.github.com/LinusU/7eebf8fbf845d3512628/revisions. –

관련 문제