@parcel/workers 2.0.0-nightly.130 → 2.0.0-nightly.1303
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +23 -0
- package/lib/Handle.js +14 -45
- package/lib/Worker.js +100 -27
- package/lib/WorkerFarm.js +260 -104
- package/lib/bus.js +10 -2
- package/lib/child.js +129 -62
- package/lib/childState.js +1 -1
- package/lib/cpuCount.js +28 -7
- package/lib/index.js +41 -10
- package/lib/process/ProcessChild.js +22 -11
- package/lib/process/ProcessWorker.js +30 -19
- package/lib/threads/ThreadsChild.js +32 -14
- package/lib/threads/ThreadsWorker.js +28 -16
- package/package.json +19 -8
- package/src/Handle.js +10 -39
- package/src/Worker.js +82 -15
- package/src/WorkerFarm.js +219 -54
- package/src/bus.js +1 -1
- package/src/child.js +83 -24
- package/src/cpuCount.js +9 -4
- package/src/index.js +8 -2
- package/src/process/ProcessChild.js +2 -1
- package/src/process/ProcessWorker.js +1 -1
- package/src/threads/ThreadsWorker.js +2 -2
- package/test/cpuCount.test.js +1 -1
- package/test/integration/workerfarm/console.js +1 -1
- package/test/integration/workerfarm/logging.js +1 -1
- package/test/integration/workerfarm/reverse-handle.js +2 -2
- package/test/workerfarm.js +5 -5
- package/lib/Profiler.js +0 -70
- package/lib/Trace.js +0 -126
- package/src/Profiler.js +0 -93
- package/src/Trace.js +0 -121
package/lib/WorkerFarm.js
CHANGED
@@ -11,107 +11,129 @@ Object.defineProperty(exports, "Handle", {
|
|
11
11
|
});
|
12
12
|
exports.default = void 0;
|
13
13
|
|
14
|
-
|
14
|
+
function _assert() {
|
15
|
+
const data = _interopRequireDefault(require("assert"));
|
15
16
|
|
16
|
-
|
17
|
+
_assert = function () {
|
18
|
+
return data;
|
19
|
+
};
|
17
20
|
|
18
|
-
|
21
|
+
return data;
|
22
|
+
}
|
19
23
|
|
20
|
-
|
24
|
+
function _nullthrows() {
|
25
|
+
const data = _interopRequireDefault(require("nullthrows"));
|
21
26
|
|
22
|
-
|
27
|
+
_nullthrows = function () {
|
28
|
+
return data;
|
29
|
+
};
|
23
30
|
|
24
|
-
|
31
|
+
return data;
|
32
|
+
}
|
25
33
|
|
26
|
-
|
34
|
+
function _events() {
|
35
|
+
const data = _interopRequireDefault(require("events"));
|
27
36
|
|
28
|
-
|
37
|
+
_events = function () {
|
38
|
+
return data;
|
39
|
+
};
|
29
40
|
|
30
|
-
|
41
|
+
return data;
|
42
|
+
}
|
31
43
|
|
32
|
-
|
44
|
+
function _core() {
|
45
|
+
const data = require("@parcel/core");
|
33
46
|
|
34
|
-
|
47
|
+
_core = function () {
|
48
|
+
return data;
|
49
|
+
};
|
35
50
|
|
36
|
-
|
51
|
+
return data;
|
52
|
+
}
|
37
53
|
|
38
|
-
|
54
|
+
function _diagnostic() {
|
55
|
+
const data = _interopRequireWildcard(require("@parcel/diagnostic"));
|
39
56
|
|
40
|
-
|
57
|
+
_diagnostic = function () {
|
58
|
+
return data;
|
59
|
+
};
|
41
60
|
|
42
|
-
|
61
|
+
return data;
|
62
|
+
}
|
43
63
|
|
44
|
-
|
64
|
+
var _Worker = _interopRequireDefault(require("./Worker"));
|
45
65
|
|
46
|
-
|
66
|
+
var _cpuCount = _interopRequireDefault(require("./cpuCount"));
|
47
67
|
|
48
|
-
|
68
|
+
var _Handle = _interopRequireDefault(require("./Handle"));
|
49
69
|
|
50
|
-
|
70
|
+
var _childState = require("./childState");
|
51
71
|
|
52
|
-
|
72
|
+
var _backend = require("./backend");
|
53
73
|
|
54
|
-
|
55
|
-
|
74
|
+
function _profiler() {
|
75
|
+
const data = require("@parcel/profiler");
|
56
76
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
class WorkerFarm extends _events.default {
|
61
|
-
constructor(farmOptions = {}) {
|
62
|
-
super();
|
77
|
+
_profiler = function () {
|
78
|
+
return data;
|
79
|
+
};
|
63
80
|
|
64
|
-
|
81
|
+
return data;
|
82
|
+
}
|
65
83
|
|
66
|
-
|
84
|
+
function _fs() {
|
85
|
+
const data = _interopRequireDefault(require("fs"));
|
67
86
|
|
68
|
-
|
87
|
+
_fs = function () {
|
88
|
+
return data;
|
89
|
+
};
|
69
90
|
|
70
|
-
|
91
|
+
return data;
|
92
|
+
}
|
71
93
|
|
72
|
-
|
94
|
+
function _logger() {
|
95
|
+
const data = _interopRequireDefault(require("@parcel/logger"));
|
73
96
|
|
74
|
-
|
97
|
+
_logger = function () {
|
98
|
+
return data;
|
99
|
+
};
|
75
100
|
|
76
|
-
|
101
|
+
return data;
|
102
|
+
}
|
77
103
|
|
78
|
-
|
104
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
79
105
|
|
80
|
-
|
106
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
81
107
|
|
82
|
-
|
108
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
83
109
|
|
84
|
-
|
110
|
+
let referenceId = 1;
|
85
111
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
reject,
|
99
|
-
retries: 0
|
100
|
-
}));
|
101
|
-
}),
|
102
|
-
getSharedReference: ref => this.sharedReferences.get(ref),
|
103
|
-
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
104
|
-
});
|
112
|
+
/**
|
113
|
+
* workerPath should always be defined inside farmOptions
|
114
|
+
*/
|
115
|
+
class WorkerFarm extends _events().default {
|
116
|
+
callQueue = [];
|
117
|
+
ending = false;
|
118
|
+
warmWorkers = 0;
|
119
|
+
workers = new Map();
|
120
|
+
handles = new Map();
|
121
|
+
sharedReferences = new Map();
|
122
|
+
sharedReferencesByValue = new Map();
|
123
|
+
serializedSharedReferences = new Map();
|
105
124
|
|
106
|
-
|
125
|
+
constructor(farmOptions = {}) {
|
126
|
+
super();
|
127
|
+
this.options = {
|
107
128
|
maxConcurrentWorkers: WorkerFarm.getNumWorkers(),
|
108
129
|
maxConcurrentCallsPerWorker: WorkerFarm.getConcurrentCallsPerWorker(),
|
109
130
|
forcedKillTime: 500,
|
110
131
|
warmWorkers: false,
|
111
132
|
useLocalWorker: true,
|
112
133
|
// TODO: setting this to false makes some tests fail, figure out why
|
113
|
-
backend: (0, _backend.detectBackend)()
|
114
|
-
|
134
|
+
backend: (0, _backend.detectBackend)(),
|
135
|
+
...farmOptions
|
136
|
+
};
|
115
137
|
|
116
138
|
if (!this.options.workerPath) {
|
117
139
|
throw new Error('Please provide a worker path!');
|
@@ -119,10 +141,44 @@ class WorkerFarm extends _events.default {
|
|
119
141
|
|
120
142
|
|
121
143
|
this.localWorker = require(this.options.workerPath);
|
122
|
-
this.
|
144
|
+
this.localWorkerInit = this.localWorker.childInit != null ? this.localWorker.childInit() : null;
|
145
|
+
this.run = this.createHandle('run'); // Worker thread stdout is by default piped into the process stdout, if there are enough worker
|
146
|
+
// threads to exceed the default listener limit, then anything else piping into stdout will trigger
|
147
|
+
// the `MaxListenersExceededWarning`, so we should ensure the max listeners is at least equal to the
|
148
|
+
// number of workers + 1 for the main thread.
|
149
|
+
//
|
150
|
+
// Note this can't be fixed easily where other things pipe into stdout - even after starting > 10 worker
|
151
|
+
// threads `process.stdout.getMaxListeners()` will still return 10, however adding another pipe into `stdout`
|
152
|
+
// will give the warning with `<worker count + 1>` as the number of listeners.
|
153
|
+
|
154
|
+
process.stdout.setMaxListeners(Math.max(process.stdout.getMaxListeners(), WorkerFarm.getNumWorkers() + 1));
|
123
155
|
this.startMaxWorkers();
|
124
156
|
}
|
125
157
|
|
158
|
+
workerApi = {
|
159
|
+
callMaster: async (request, awaitResponse = true) => {
|
160
|
+
// $FlowFixMe
|
161
|
+
let result = await this.processRequest({ ...request,
|
162
|
+
awaitResponse
|
163
|
+
});
|
164
|
+
return (0, _core().deserialize)((0, _core().serialize)(result));
|
165
|
+
},
|
166
|
+
createReverseHandle: fn => this.createReverseHandle(fn),
|
167
|
+
callChild: (childId, request) => new Promise((resolve, reject) => {
|
168
|
+
(0, _nullthrows().default)(this.workers.get(childId)).call({ ...request,
|
169
|
+
resolve,
|
170
|
+
reject,
|
171
|
+
retries: 0
|
172
|
+
});
|
173
|
+
}),
|
174
|
+
runHandle: (handle, args) => this.workerApi.callChild((0, _nullthrows().default)(handle.childId), {
|
175
|
+
handle: handle.id,
|
176
|
+
args
|
177
|
+
}),
|
178
|
+
getSharedReference: ref => this.sharedReferences.get(ref),
|
179
|
+
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
180
|
+
};
|
181
|
+
|
126
182
|
warmupWorker(method, args) {
|
127
183
|
// Workers are already stopping
|
128
184
|
if (this.ending) {
|
@@ -149,19 +205,35 @@ class WorkerFarm extends _events.default {
|
|
149
205
|
return this.options.maxConcurrentWorkers > 0 || !this.options.useLocalWorker;
|
150
206
|
}
|
151
207
|
|
152
|
-
createHandle(method) {
|
153
|
-
|
208
|
+
createHandle(method, useMainThread = false) {
|
209
|
+
if (!this.options.useLocalWorker) {
|
210
|
+
useMainThread = false;
|
211
|
+
}
|
212
|
+
|
213
|
+
return async (...args) => {
|
154
214
|
// Child process workers are slow to start (~600ms).
|
155
215
|
// While we're waiting, just run on the main thread.
|
156
216
|
// This significantly speeds up startup time.
|
157
|
-
if (this.shouldUseRemoteWorkers()) {
|
217
|
+
if (this.shouldUseRemoteWorkers() && !useMainThread) {
|
158
218
|
return this.addCall(method, [...args, false]);
|
159
219
|
} else {
|
160
220
|
if (this.options.warmWorkers && this.shouldStartRemoteWorkers()) {
|
161
221
|
this.warmupWorker(method, args);
|
162
222
|
}
|
163
223
|
|
164
|
-
let processedArgs
|
224
|
+
let processedArgs;
|
225
|
+
|
226
|
+
if (!useMainThread) {
|
227
|
+
processedArgs = (0, _core().restoreDeserializedObject)((0, _core().prepareForSerialization)([...args, false]));
|
228
|
+
} else {
|
229
|
+
processedArgs = args;
|
230
|
+
}
|
231
|
+
|
232
|
+
if (this.localWorkerInit != null) {
|
233
|
+
await this.localWorkerInit;
|
234
|
+
this.localWorkerInit = null;
|
235
|
+
}
|
236
|
+
|
165
237
|
return this.localWorker[method](this.workerApi, ...processedArgs);
|
166
238
|
}
|
167
239
|
};
|
@@ -171,6 +243,8 @@ class WorkerFarm extends _events.default {
|
|
171
243
|
// Handle ipc errors
|
172
244
|
if (error.code === 'ERR_IPC_CHANNEL_CLOSED') {
|
173
245
|
return this.stopWorker(worker);
|
246
|
+
} else {
|
247
|
+
_logger().default.error(error, '@parcel/workers');
|
174
248
|
}
|
175
249
|
}
|
176
250
|
|
@@ -178,9 +252,11 @@ class WorkerFarm extends _events.default {
|
|
178
252
|
let worker = new _Worker.default({
|
179
253
|
forcedKillTime: this.options.forcedKillTime,
|
180
254
|
backend: this.options.backend,
|
181
|
-
|
255
|
+
shouldPatchConsole: this.options.shouldPatchConsole,
|
256
|
+
shouldTrace: this.options.shouldTrace,
|
257
|
+
sharedReferences: this.sharedReferences
|
182
258
|
});
|
183
|
-
worker.fork((0, _nullthrows.default)(this.options.workerPath));
|
259
|
+
worker.fork((0, _nullthrows().default)(this.options.workerPath));
|
184
260
|
worker.on('request', data => this.processRequest(data, worker));
|
185
261
|
worker.on('ready', () => this.processQueue());
|
186
262
|
worker.on('response', () => this.processQueue());
|
@@ -215,7 +291,9 @@ class WorkerFarm extends _events.default {
|
|
215
291
|
this.startChild();
|
216
292
|
}
|
217
293
|
|
218
|
-
|
294
|
+
let workers = [...this.workers.values()].sort((a, b) => a.calls.size - b.calls.size);
|
295
|
+
|
296
|
+
for (let worker of workers) {
|
219
297
|
if (!this.callQueue.length) {
|
220
298
|
break;
|
221
299
|
}
|
@@ -225,9 +303,19 @@ class WorkerFarm extends _events.default {
|
|
225
303
|
}
|
226
304
|
|
227
305
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
228
|
-
|
306
|
+
this.callWorker(worker, this.callQueue.shift());
|
307
|
+
}
|
308
|
+
}
|
309
|
+
}
|
310
|
+
|
311
|
+
async callWorker(worker, call) {
|
312
|
+
for (let ref of this.sharedReferences.keys()) {
|
313
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
314
|
+
await worker.sendSharedReference(ref, this.getSerializedSharedReference(ref));
|
229
315
|
}
|
230
316
|
}
|
317
|
+
|
318
|
+
worker.call(call);
|
231
319
|
}
|
232
320
|
|
233
321
|
async processRequest(data, worker) {
|
@@ -242,7 +330,9 @@ class WorkerFarm extends _events.default {
|
|
242
330
|
let mod;
|
243
331
|
|
244
332
|
if (handleId != null) {
|
245
|
-
|
333
|
+
var _this$handles$get;
|
334
|
+
|
335
|
+
mod = (0, _nullthrows().default)((_this$handles$get = this.handles.get(handleId)) === null || _this$handles$get === void 0 ? void 0 : _this$handles$get.fn);
|
246
336
|
} else if (location) {
|
247
337
|
// $FlowFixMe this must be dynamic
|
248
338
|
mod = require(location);
|
@@ -261,27 +351,26 @@ class WorkerFarm extends _events.default {
|
|
261
351
|
idx,
|
262
352
|
type: 'response',
|
263
353
|
contentType: 'error',
|
264
|
-
content: (0, _diagnostic.anyToDiagnostic)(e)
|
354
|
+
content: (0, _diagnostic().anyToDiagnostic)(e)
|
265
355
|
});
|
266
356
|
|
267
357
|
let result;
|
268
358
|
|
269
359
|
if (method == null) {
|
270
360
|
try {
|
271
|
-
result = responseFromContent(
|
361
|
+
result = responseFromContent(await mod(...args));
|
272
362
|
} catch (e) {
|
273
363
|
result = errorResponseFromError(e);
|
274
364
|
}
|
275
365
|
} else {
|
276
366
|
// ESModule default interop
|
277
|
-
// $FlowFixMe
|
278
367
|
if (mod.__esModule && !mod[method] && mod.default) {
|
279
368
|
mod = mod.default;
|
280
369
|
}
|
281
370
|
|
282
371
|
try {
|
283
372
|
// $FlowFixMe
|
284
|
-
result = responseFromContent(
|
373
|
+
result = responseFromContent(await mod[method](...args));
|
285
374
|
} catch (e) {
|
286
375
|
result = errorResponseFromError(e);
|
287
376
|
}
|
@@ -292,7 +381,7 @@ class WorkerFarm extends _events.default {
|
|
292
381
|
worker.send(result);
|
293
382
|
} else {
|
294
383
|
if (result.contentType === 'error') {
|
295
|
-
throw new _diagnostic.default({
|
384
|
+
throw new (_diagnostic().default)({
|
296
385
|
diagnostic: result.content
|
297
386
|
});
|
298
387
|
}
|
@@ -321,6 +410,7 @@ class WorkerFarm extends _events.default {
|
|
321
410
|
|
322
411
|
async end() {
|
323
412
|
this.ending = true;
|
413
|
+
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
324
414
|
|
325
415
|
for (let handle of this.handles.values()) {
|
326
416
|
handle.dispose();
|
@@ -329,7 +419,6 @@ class WorkerFarm extends _events.default {
|
|
329
419
|
this.handles = new Map();
|
330
420
|
this.sharedReferences = new Map();
|
331
421
|
this.sharedReferencesByValue = new Map();
|
332
|
-
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
333
422
|
this.ending = false;
|
334
423
|
}
|
335
424
|
|
@@ -350,46 +439,42 @@ class WorkerFarm extends _events.default {
|
|
350
439
|
|
351
440
|
createReverseHandle(fn) {
|
352
441
|
let handle = new _Handle.default({
|
353
|
-
fn
|
354
|
-
workerApi: this.workerApi
|
442
|
+
fn
|
355
443
|
});
|
356
444
|
this.handles.set(handle.id, handle);
|
357
445
|
return handle;
|
358
446
|
}
|
359
447
|
|
360
|
-
|
448
|
+
createSharedReference(value, isCacheable = true) {
|
361
449
|
let ref = referenceId++;
|
362
450
|
this.sharedReferences.set(ref, value);
|
363
451
|
this.sharedReferencesByValue.set(value, ref);
|
364
|
-
let promises = [];
|
365
452
|
|
366
|
-
|
367
|
-
|
368
|
-
worker.call({
|
369
|
-
method: 'createSharedReference',
|
370
|
-
args: [ref, value],
|
371
|
-
resolve,
|
372
|
-
reject,
|
373
|
-
retries: 0
|
374
|
-
});
|
375
|
-
}));
|
453
|
+
if (!isCacheable) {
|
454
|
+
this.serializedSharedReferences.set(ref, null);
|
376
455
|
}
|
377
456
|
|
378
|
-
await Promise.all(promises);
|
379
457
|
return {
|
380
458
|
ref,
|
381
459
|
dispose: () => {
|
382
460
|
this.sharedReferences.delete(ref);
|
383
461
|
this.sharedReferencesByValue.delete(value);
|
462
|
+
this.serializedSharedReferences.delete(ref);
|
384
463
|
let promises = [];
|
385
464
|
|
386
465
|
for (let worker of this.workers.values()) {
|
466
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
467
|
+
continue;
|
468
|
+
}
|
469
|
+
|
470
|
+
worker.sentSharedReferences.delete(ref);
|
387
471
|
promises.push(new Promise((resolve, reject) => {
|
388
472
|
worker.call({
|
389
473
|
method: 'deleteSharedReference',
|
390
474
|
args: [ref],
|
391
475
|
resolve,
|
392
476
|
reject,
|
477
|
+
skipReadyCheck: true,
|
393
478
|
retries: 0
|
394
479
|
});
|
395
480
|
}));
|
@@ -400,6 +485,24 @@ class WorkerFarm extends _events.default {
|
|
400
485
|
};
|
401
486
|
}
|
402
487
|
|
488
|
+
getSerializedSharedReference(ref) {
|
489
|
+
let cached = this.serializedSharedReferences.get(ref);
|
490
|
+
|
491
|
+
if (cached) {
|
492
|
+
return cached;
|
493
|
+
}
|
494
|
+
|
495
|
+
let value = this.sharedReferences.get(ref);
|
496
|
+
let buf = (0, _core().serialize)(value).buffer; // If the reference was created with the isCacheable option set to false,
|
497
|
+
// serializedSharedReferences will contain `null` as the value.
|
498
|
+
|
499
|
+
if (cached !== null) {
|
500
|
+
this.serializedSharedReferences.set(ref, buf);
|
501
|
+
}
|
502
|
+
|
503
|
+
return buf;
|
504
|
+
}
|
505
|
+
|
403
506
|
async startProfile() {
|
404
507
|
let promises = [];
|
405
508
|
|
@@ -410,12 +513,13 @@ class WorkerFarm extends _events.default {
|
|
410
513
|
args: [],
|
411
514
|
resolve,
|
412
515
|
reject,
|
413
|
-
retries: 0
|
516
|
+
retries: 0,
|
517
|
+
skipReadyCheck: true
|
414
518
|
});
|
415
519
|
}));
|
416
520
|
}
|
417
521
|
|
418
|
-
this.profiler = new
|
522
|
+
this.profiler = new (_profiler().SamplingProfiler)();
|
419
523
|
promises.push(this.profiler.startProfiling());
|
420
524
|
await Promise.all(promises);
|
421
525
|
}
|
@@ -436,15 +540,16 @@ class WorkerFarm extends _events.default {
|
|
436
540
|
args: [],
|
437
541
|
resolve,
|
438
542
|
reject,
|
439
|
-
retries: 0
|
543
|
+
retries: 0,
|
544
|
+
skipReadyCheck: true
|
440
545
|
});
|
441
546
|
}));
|
442
547
|
}
|
443
548
|
|
444
549
|
var profiles = await Promise.all(promises);
|
445
|
-
let trace = new
|
446
|
-
let filename = `profile-${
|
447
|
-
let stream = trace.pipe(_fs.default.createWriteStream(filename));
|
550
|
+
let trace = new (_profiler().Trace)();
|
551
|
+
let filename = `profile-${getTimeId()}.trace`;
|
552
|
+
let stream = trace.pipe(_fs().default.createWriteStream(filename));
|
448
553
|
|
449
554
|
for (let profile of profiles) {
|
450
555
|
trace.addCPUProfile(names.shift(), profile);
|
@@ -455,14 +560,60 @@ class WorkerFarm extends _events.default {
|
|
455
560
|
stream.once('finish', resolve);
|
456
561
|
});
|
457
562
|
|
458
|
-
_logger.default.info({
|
563
|
+
_logger().default.info({
|
459
564
|
origin: '@parcel/workers',
|
460
|
-
message: `Wrote profile to ${filename}`
|
565
|
+
message: (0, _diagnostic().md)`Wrote profile to ${filename}`
|
461
566
|
});
|
462
567
|
}
|
463
568
|
|
569
|
+
async callAllWorkers(method, args) {
|
570
|
+
let promises = [];
|
571
|
+
|
572
|
+
for (let worker of this.workers.values()) {
|
573
|
+
promises.push(new Promise((resolve, reject) => {
|
574
|
+
worker.call({
|
575
|
+
method,
|
576
|
+
args,
|
577
|
+
resolve,
|
578
|
+
reject,
|
579
|
+
retries: 0
|
580
|
+
});
|
581
|
+
}));
|
582
|
+
}
|
583
|
+
|
584
|
+
promises.push(this.localWorker[method](this.workerApi, ...args));
|
585
|
+
await Promise.all(promises);
|
586
|
+
}
|
587
|
+
|
588
|
+
async takeHeapSnapshot() {
|
589
|
+
let snapshotId = getTimeId();
|
590
|
+
|
591
|
+
try {
|
592
|
+
let snapshotPaths = await Promise.all([...this.workers.values()].map(worker => new Promise((resolve, reject) => {
|
593
|
+
worker.call({
|
594
|
+
method: 'takeHeapSnapshot',
|
595
|
+
args: [snapshotId],
|
596
|
+
resolve,
|
597
|
+
reject,
|
598
|
+
retries: 0,
|
599
|
+
skipReadyCheck: true
|
600
|
+
});
|
601
|
+
})));
|
602
|
+
|
603
|
+
_logger().default.info({
|
604
|
+
origin: '@parcel/workers',
|
605
|
+
message: (0, _diagnostic().md)`Wrote heap snapshots to the following paths:\n${snapshotPaths.join('\n')}`
|
606
|
+
});
|
607
|
+
} catch {
|
608
|
+
_logger().default.error({
|
609
|
+
origin: '@parcel/workers',
|
610
|
+
message: 'Unable to take heap snapshots. Note: requires Node 11.13.0+'
|
611
|
+
});
|
612
|
+
}
|
613
|
+
}
|
614
|
+
|
464
615
|
static getNumWorkers() {
|
465
|
-
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : (0, _cpuCount.default)();
|
616
|
+
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : Math.ceil((0, _cpuCount.default)() / 2);
|
466
617
|
}
|
467
618
|
|
468
619
|
static isWorker() {
|
@@ -470,14 +621,19 @@ class WorkerFarm extends _events.default {
|
|
470
621
|
}
|
471
622
|
|
472
623
|
static getWorkerApi() {
|
473
|
-
(0, _assert.default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
624
|
+
(0, _assert().default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
474
625
|
return _childState.child.workerApi;
|
475
626
|
}
|
476
627
|
|
477
628
|
static getConcurrentCallsPerWorker() {
|
478
|
-
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) ||
|
629
|
+
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) || 30;
|
479
630
|
}
|
480
631
|
|
481
632
|
}
|
482
633
|
|
483
|
-
exports.default = WorkerFarm;
|
634
|
+
exports.default = WorkerFarm;
|
635
|
+
|
636
|
+
function getTimeId() {
|
637
|
+
let now = new Date();
|
638
|
+
return String(now.getFullYear()) + String(now.getMonth() + 1).padStart(2, '0') + String(now.getDate()).padStart(2, '0') + '-' + String(now.getHours()).padStart(2, '0') + String(now.getMinutes()).padStart(2, '0') + String(now.getSeconds()).padStart(2, '0');
|
639
|
+
}
|
package/lib/bus.js
CHANGED
@@ -5,13 +5,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
7
|
|
8
|
-
|
8
|
+
function _events() {
|
9
|
+
const data = _interopRequireDefault(require("events"));
|
10
|
+
|
11
|
+
_events = function () {
|
12
|
+
return data;
|
13
|
+
};
|
14
|
+
|
15
|
+
return data;
|
16
|
+
}
|
9
17
|
|
10
18
|
var _childState = require("./childState");
|
11
19
|
|
12
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
21
|
|
14
|
-
class Bus extends _events.default {
|
22
|
+
class Bus extends _events().default {
|
15
23
|
emit(event, ...args) {
|
16
24
|
if (_childState.child) {
|
17
25
|
_childState.child.workerApi.callMaster({
|