1
- var cluster = require ( 'cluster' ) ;
2
1
var process = require ( 'process' ) ;
2
+ var childProcess = require ( 'child_process' ) ;
3
3
var path = require ( 'path' ) ;
4
4
5
5
var WorkResult = require ( './WorkResult' ) ;
6
6
var NormalizedMessage = require ( './NormalizedMessage' ) ;
7
7
8
- // setup master
9
- cluster . setupMaster ( {
10
- exec : path . join ( __dirname , 'service.js' ) ,
11
- args : [ '--max-old-space-size=' + process . env . MEMORY_LIMIT ]
12
- } ) ;
13
-
14
8
// fork workers...
15
9
var division = parseInt ( process . env . WORK_DIVISION ) ;
10
+ var workers = [ ] ;
16
11
17
- for ( var i = 0 ; i < division ; i ++ ) {
18
- cluster . fork ( { WORK_NUMBER : i } ) ;
12
+ for ( var number = 0 ; number < division ; number ++ ) {
13
+ workers . push (
14
+ childProcess . fork (
15
+ path . resolve ( __dirname , './service.js' ) ,
16
+ [ ] ,
17
+ {
18
+ execArgv : [ '--max-old-space-size=' + process . env . MEMORY_LIMIT ] ,
19
+ env : Object . assign ( { } , process . env , { WORKER_NUMBER : number } ) ,
20
+ stdio : [ 'inherit' , 'inherit' , 'inherit' , 'ipc' ]
21
+ }
22
+ )
23
+ ) ;
19
24
}
20
25
21
- var workerIds = Object . keys ( cluster . workers ) ;
22
- var result = new WorkResult ( workerIds ) ;
26
+ var pids = workers . map ( function ( worker ) { return worker . pid ; } ) ;
27
+ var result = new WorkResult ( pids ) ;
23
28
24
29
process . on ( 'message' , function ( message ) {
25
30
// broadcast message to all workers
26
- workerIds . forEach ( function ( workerId ) {
27
- cluster . workers [ workerId ] . send ( message ) ;
31
+ workers . forEach ( function ( worker ) {
32
+ worker . send ( message ) ;
28
33
} ) ;
29
34
30
35
// clear previous result set
31
36
result . clear ( ) ;
32
37
} ) ;
33
38
34
39
// listen to all workers
35
- workerIds . forEach ( function ( workerId ) {
36
- cluster . workers [ workerId ] . on ( 'message' , function ( message ) {
40
+ workers . forEach ( function ( worker ) {
41
+ worker . on ( 'message' , function ( message ) {
37
42
// set result from worker
38
43
result . set (
39
- workerId ,
44
+ worker . pid ,
40
45
{
41
46
diagnostics : message . diagnostics . map ( NormalizedMessage . createFromJSON ) ,
42
47
lints : message . lints . map ( NormalizedMessage . createFromJSON )
@@ -58,7 +63,26 @@ workerIds.forEach(function (workerId) {
58
63
merged . diagnostics = NormalizedMessage . deduplicate ( merged . diagnostics ) ;
59
64
merged . lints = NormalizedMessage . deduplicate ( merged . lints ) ;
60
65
61
- process . send ( merged ) ;
66
+ try {
67
+ process . send ( merged ) ;
68
+ } catch ( e ) {
69
+ // channel closed...
70
+ process . exit ( ) ;
71
+ }
62
72
}
63
73
} ) ;
64
74
} ) ;
75
+
76
+ process . on ( 'SIGINT' , function ( ) {
77
+ process . exit ( ) ;
78
+ } ) ;
79
+
80
+ process . on ( 'exit' , function ( ) {
81
+ workers . forEach ( function ( worker ) {
82
+ try {
83
+ worker . kill ( ) ;
84
+ } catch ( e ) {
85
+ // do nothing...
86
+ }
87
+ } ) ;
88
+ } ) ;
0 commit comments