1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
'use strict';
const resources = require('../debian/resources.js');
const generateData = require('../index.js');
const utils = require('../scripts/utils.js');
// -----------------------------------------------------------------------------
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const pad = (number) => {
return String(number).padStart(2, '0');
};
const getTime = () => {
const currentdate = new Date();
return pad(currentdate.getHours()) + ':' +
pad(currentdate.getMinutes()) + ':' +
pad(currentdate.getSeconds());
};
const complicatedWorkThatTakesTime = (resource, callback) => {
if (resource.length) {
const version = resource[0].version;
console.log('[%s] Worker %d \u2192 Unicode v%s',
getTime(), cluster.worker.id, version);
generateData(version);
complicatedWorkThatTakesTime(
resource.slice(1),
callback
);
} else {
callback();
}
};
if (cluster.isMaster) {
for (let index = 0; index < numCPUs; index++) {
cluster.fork();
}
cluster.on('online', (worker) => {
const size = Math.round(resources.length / numCPUs);
const x = worker.id - 1;
// divide work
if (worker.id === 1) { // first worker
worker.send(resources.slice(0, worker.id * size));
} else if (worker.id < numCPUs) { // other workers, except the last one
worker.send(resources.slice(x * size, worker.id * size));
} else { // last worker
worker.send(resources.slice(x * size, resources.length));
}
});
cluster.on('exit', (worker) => {
if (worker.exitedAfterDisconnect) {
console.log('[%s] Worker %d is done!', getTime(), worker.id);
}
});
} else {
process.on('message', (message) => {
complicatedWorkThatTakesTime(message, () => {
cluster.worker.kill();
});
});
}
|