workerrpc
Version:
Worker/Pool Abstraction for RedisRPC
114 lines (92 loc) • 2.91 kB
JavaScript
var should = require('should');
var async = require("async");
var WorkerRPC = require("../lib/WorkerRPC");
//WE ARE GOING TO CREATE AS MANY WORKERS AS WE HAVE CORES
var numCores = require("os").cpus().length;
var createWorkers = function(numCores,script,callback) {
WorkerRPC.createWorkers(numCores,script, function(err,workers) {
async.forEach(workers,function(worker,next) {
worker.callme(function() {
next();
});
},callback);
});
}
describe('WorkerRPC', function(){
this.timeout(10000);
it('should work with simple objects', function(done) {
createWorkers(numCores,"./test/dep/worker_object.js",done);
});
it('should work with classes methods', function(done) {
createWorkers(numCores,"./test/dep/worker_class.js",done);
});
it('should work within a pool with callback/RPC', function(done) {
var results = {insideCircle:0,total:0};
var workloads = [];
for(var i = 0;i < 10; i++) {
workloads.push({
script: "./test/dep/pi.js",
action: function(instance,params,finished) {
instance.pi(1000000,function(insideCircle,numOfTrials) {
results.insideCircle+=insideCircle;
results.total+=numOfTrials;
finished();
});
},
params: {}
});
}
var combineResults = function() {
var piEstimate = 4*results.insideCircle/results.total;
var piDelta = Math.abs(Math.PI-piEstimate);
piDelta.should.be.below(0.01);
done();
};
var numCores = require("os").cpus().length;
var pool = WorkerRPC.pool(numCores, combineResults);
pool.add(workloads);
});
it('should work within a pool using map/reduce', function(done) {
var numCores = require("os").cpus().length;
var workloads = WorkerRPC.createWorkload({
maxParallel: numCores,
script: "./test/dep/pi.js"
});
workloads.add(
[{numOfTrials:1},{numOfTrials:2},{numOfTrials:4},{numOfTrials:8}]
);
workloads.
map(
function doActualWork(workload,worker,next) {
worker.pi(workload.numOfTrials,function(insideCircle) {
next(null,{
insideCircle:insideCircle,
total:workload.numOfTrials
});
});
}
).reduce(
//WE ARE GOING TO SUM THE RESULTS UP, STARTING AT ZERO
{insideCircle:0,total:0},
//CODE TO ACTUALLY ADD RESULTS
function sumSingleWorksResults(sum, current, next) {
sum.insideCircle+=current.insideCircle;
sum.total+=current.total;
next(null,sum);
},
//FINISHED ADDING UP, PRINT RESULTS
function printSumAndEstimate(err,sum) {
var piEstimate = 4*sum.insideCircle/sum.total;
var piDelta = Math.abs(Math.PI-piEstimate);
piDelta.should.be.below(0.01);
done();
}
);
//YOU CAN ADD WORKLOAD LATER ON
setTimeout(function() {
workloads.add({numOfTrials:1000000});
},10);
});
it('should be able to share data across workers', function(done) {
});
});