-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathgenerate-data.js
96 lines (73 loc) · 2.15 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
'use strict';
const resources = require('../data/resources.js');
const generateData = require('../index.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);
console.groupCollapsed();
generateData(version);
console.groupEnd();
complicatedWorkThatTakesTime(
resource.slice(1),
callback
);
} else {
callback();
}
};
if (cluster.isPrimary) {
for (let index = 0; index < numCPUs; index++) {
const worker = cluster.fork();
worker.on('message', (error) => {
for (const id in cluster.workers) {
cluster.workers[id].kill();
}
throw new Error(`Worker ${worker.id} encountered an error: ${error}`);
})
}
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();
});
});
process.on('uncaughtException', (error) => {
console.error(error);
process.send(error.message);
});
process.on('unhandledRejection', (error) => {
console.error(error);
process.send(error.message || error);
});
}