Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

73 linhas
2.6 KiB

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var childProcess = require("child_process");
  4. var path = require("path");
  5. var process = require("process");
  6. var WorkResult_1 = require("./WorkResult");
  7. var NormalizedMessage_1 = require("./NormalizedMessage");
  8. // fork workers...
  9. var division = parseInt(process.env.WORK_DIVISION, 10);
  10. var workers = [];
  11. for (var num = 0; num < division; num++) {
  12. workers.push(childProcess.fork(path.resolve(__dirname, './service.js'), [], {
  13. execArgv: ['--max-old-space-size=' + process.env.MEMORY_LIMIT],
  14. env: Object.assign({}, process.env, { WORK_NUMBER: num }),
  15. stdio: ['inherit', 'inherit', 'inherit', 'ipc']
  16. }));
  17. }
  18. var pids = workers.map(function (worker) { return worker.pid; });
  19. var result = new WorkResult_1.WorkResult(pids);
  20. process.on('message', function (message) {
  21. // broadcast message to all workers
  22. workers.forEach(function (worker) {
  23. try {
  24. worker.send(message);
  25. }
  26. catch (e) {
  27. // channel closed - something went wrong - close cluster...
  28. process.exit();
  29. }
  30. });
  31. // clear previous result set
  32. result.clear();
  33. });
  34. // listen to all workers
  35. workers.forEach(function (worker) {
  36. worker.on('message', function (message) {
  37. // set result from worker
  38. result.set(worker.pid, {
  39. diagnostics: message.diagnostics.map(NormalizedMessage_1.NormalizedMessage.createFromJSON),
  40. lints: message.lints.map(NormalizedMessage_1.NormalizedMessage.createFromJSON)
  41. });
  42. // if we have result from all workers, send merged
  43. if (result.hasAll()) {
  44. var merged = result.reduce(function (innerMerged, innerResult) { return ({
  45. diagnostics: innerMerged.diagnostics.concat(innerResult.diagnostics),
  46. lints: innerMerged.lints.concat(innerResult.lints)
  47. }); }, { diagnostics: [], lints: [] });
  48. merged.diagnostics = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.diagnostics);
  49. merged.lints = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.lints);
  50. try {
  51. process.send(merged);
  52. }
  53. catch (e) {
  54. // channel closed...
  55. process.exit();
  56. }
  57. }
  58. });
  59. });
  60. process.on('SIGINT', function () {
  61. process.exit();
  62. });
  63. process.on('exit', function () {
  64. workers.forEach(function (worker) {
  65. try {
  66. worker.kill();
  67. }
  68. catch (e) {
  69. // do nothing...
  70. }
  71. });
  72. });