-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathgenerate-data.js
79 lines (58 loc) · 1.75 KB
/
generate-data.js
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('../data/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 = function(number) {
return ('00' + String(number)).slice(-2);
};
const getTime = function() {
const currentdate = new Date();
return pad(currentdate.getHours()) + ':' +
pad(currentdate.getMinutes()) + ':' +
pad(currentdate.getSeconds());
};
const complicatedWorkThatTakesTime = function(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', function(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', function(worker) {
if (worker.suicide) {
console.log('[%s] Worker %d is done!', getTime(), worker.id);
}
});
} else {
process.on('message', function(message) {
complicatedWorkThatTakesTime(message, function() {
cluster.worker.kill();
});
});
}