-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathgenerate-data.js
112 lines (88 loc) · 2.56 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
var resources = require('../data/resources.js');
var generateData = require('../index.js');
var utils = require('../scripts/utils.js');
var template = require('lodash.template');
var fs = require('fs');
var path = require('path');
var templatePath = path.resolve(__dirname, '..', 'templates');
var compileReadMe = template(fs.readFileSync(
path.resolve(templatePath, 'README.md'),
'utf-8')
);
var compilePackage = template(fs.readFileSync(
path.resolve(templatePath, 'package.json'),
'utf-8')
);
var compileIndex = template(fs.readFileSync(
path.resolve(templatePath, 'index.js'),
'utf-8')
);
// -----------------------------------------------------------------------------
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var i;
var pad = function(number) {
return ('00' + String(number)).slice(-2);
};
var getTime = function() {
var currentdate = new Date();
return pad(currentdate.getHours()) + ':' +
pad(currentdate.getMinutes()) + ':' +
pad(currentdate.getSeconds());
};
var complicatedWorkThatTakesTime = function(resource, callback) {
var version;
var dirs;
if (resource.length) {
version = resource[0].version;
console.log('[%s] Worker %d \u2192 Unicode v%s',
getTime(), cluster.worker.id, version);
dirs = generateData(version);
fs.writeFileSync(
path.resolve(__dirname, '..', version, 'README.md'),
compileReadMe({ 'version': version, 'dirs': dirs })
);
fs.writeFileSync(
path.resolve(__dirname, '..', version, 'index.js'),
compileIndex({ 'version': version })
);
fs.writeFileSync(
path.resolve(__dirname, '..', version, 'package.json'),
compilePackage({ 'version': version })
);
complicatedWorkThatTakesTime(
resource.slice(1),
callback
);
} else {
callback();
}
};
if (cluster.isMaster) {
for (i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
var size = Math.round(resources.length / numCPUs);
var 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();
});
});
}