|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var childProcess = require("child_process");
- var path = require("path");
- var process = require("process");
- var WorkResult_1 = require("./WorkResult");
- var NormalizedMessage_1 = require("./NormalizedMessage");
- // fork workers...
- var division = parseInt(process.env.WORK_DIVISION, 10);
- var workers = [];
- for (var num = 0; num < division; num++) {
- workers.push(childProcess.fork(path.resolve(__dirname, './service.js'), [], {
- execArgv: ['--max-old-space-size=' + process.env.MEMORY_LIMIT],
- env: Object.assign({}, process.env, { WORK_NUMBER: num }),
- stdio: ['inherit', 'inherit', 'inherit', 'ipc']
- }));
- }
- var pids = workers.map(function (worker) { return worker.pid; });
- var result = new WorkResult_1.WorkResult(pids);
- process.on('message', function (message) {
- // broadcast message to all workers
- workers.forEach(function (worker) {
- try {
- worker.send(message);
- }
- catch (e) {
- // channel closed - something went wrong - close cluster...
- process.exit();
- }
- });
- // clear previous result set
- result.clear();
- });
- // listen to all workers
- workers.forEach(function (worker) {
- worker.on('message', function (message) {
- // set result from worker
- result.set(worker.pid, {
- diagnostics: message.diagnostics.map(NormalizedMessage_1.NormalizedMessage.createFromJSON),
- lints: message.lints.map(NormalizedMessage_1.NormalizedMessage.createFromJSON)
- });
- // if we have result from all workers, send merged
- if (result.hasAll()) {
- var merged = result.reduce(function (innerMerged, innerResult) { return ({
- diagnostics: innerMerged.diagnostics.concat(innerResult.diagnostics),
- lints: innerMerged.lints.concat(innerResult.lints)
- }); }, { diagnostics: [], lints: [] });
- merged.diagnostics = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.diagnostics);
- merged.lints = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.lints);
- try {
- process.send(merged);
- }
- catch (e) {
- // channel closed...
- process.exit();
- }
- }
- });
- });
- process.on('SIGINT', function () {
- process.exit();
- });
- process.on('exit', function () {
- workers.forEach(function (worker) {
- try {
- worker.kill();
- }
- catch (e) {
- // do nothing...
- }
- });
- });
|