@parcel/workers 2.0.0-nightly.120 → 2.0.0-nightly.1202
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 +22 -0
- package/lib/Handle.js +14 -45
- package/lib/Profiler.js +20 -10
- package/lib/Trace.js +16 -11
- package/lib/Worker.js +97 -26
- package/lib/WorkerFarm.js +237 -101
- package/lib/bus.js +10 -2
- package/lib/child.js +113 -63
- package/lib/childState.js +1 -1
- package/lib/cpuCount.js +28 -7
- package/lib/index.js +26 -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 +18 -7
- package/src/Handle.js +10 -39
- package/src/Profiler.js +1 -1
- package/src/Trace.js +8 -4
- package/src/Worker.js +75 -11
- package/src/WorkerFarm.js +195 -50
- package/src/bus.js +1 -1
- package/src/child.js +70 -21
- package/src/cpuCount.js +9 -4
- package/src/index.js +1 -1
- 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/yarn-error.log +0 -13051
package/lib/WorkerFarm.js
CHANGED
|
@@ -11,15 +11,55 @@ 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
|
+
}
|
|
23
|
+
|
|
24
|
+
function _nullthrows() {
|
|
25
|
+
const data = _interopRequireDefault(require("nullthrows"));
|
|
26
|
+
|
|
27
|
+
_nullthrows = function () {
|
|
28
|
+
return data;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function _events() {
|
|
35
|
+
const data = _interopRequireDefault(require("events"));
|
|
36
|
+
|
|
37
|
+
_events = function () {
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function _core() {
|
|
45
|
+
const data = require("@parcel/core");
|
|
46
|
+
|
|
47
|
+
_core = function () {
|
|
48
|
+
return data;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function _diagnostic() {
|
|
55
|
+
const data = _interopRequireWildcard(require("@parcel/diagnostic"));
|
|
19
56
|
|
|
20
|
-
|
|
57
|
+
_diagnostic = function () {
|
|
58
|
+
return data;
|
|
59
|
+
};
|
|
21
60
|
|
|
22
|
-
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
23
63
|
|
|
24
64
|
var _Worker = _interopRequireDefault(require("./Worker"));
|
|
25
65
|
|
|
@@ -35,83 +75,59 @@ var _Profiler = _interopRequireDefault(require("./Profiler"));
|
|
|
35
75
|
|
|
36
76
|
var _Trace = _interopRequireDefault(require("./Trace"));
|
|
37
77
|
|
|
38
|
-
|
|
78
|
+
function _fs() {
|
|
79
|
+
const data = _interopRequireDefault(require("fs"));
|
|
39
80
|
|
|
40
|
-
|
|
81
|
+
_fs = function () {
|
|
82
|
+
return data;
|
|
83
|
+
};
|
|
41
84
|
|
|
42
|
-
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
43
87
|
|
|
44
|
-
function
|
|
88
|
+
function _logger() {
|
|
89
|
+
const data = _interopRequireDefault(require("@parcel/logger"));
|
|
45
90
|
|
|
46
|
-
function
|
|
91
|
+
_logger = function () {
|
|
92
|
+
return data;
|
|
93
|
+
};
|
|
47
94
|
|
|
48
|
-
|
|
95
|
+
return data;
|
|
96
|
+
}
|
|
49
97
|
|
|
50
|
-
function
|
|
98
|
+
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); }
|
|
51
99
|
|
|
52
|
-
function
|
|
100
|
+
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; }
|
|
101
|
+
|
|
102
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
53
103
|
|
|
54
|
-
let profileId = 1;
|
|
55
104
|
let referenceId = 1;
|
|
56
105
|
|
|
57
106
|
/**
|
|
58
107
|
* workerPath should always be defined inside farmOptions
|
|
59
108
|
*/
|
|
60
|
-
class WorkerFarm extends _events.default {
|
|
109
|
+
class WorkerFarm extends _events().default {
|
|
110
|
+
callQueue = [];
|
|
111
|
+
ending = false;
|
|
112
|
+
warmWorkers = 0;
|
|
113
|
+
workers = new Map();
|
|
114
|
+
handles = new Map();
|
|
115
|
+
sharedReferences = new Map();
|
|
116
|
+
sharedReferencesByValue = new Map();
|
|
117
|
+
serializedSharedReferences = new Map();
|
|
118
|
+
|
|
61
119
|
constructor(farmOptions = {}) {
|
|
62
120
|
super();
|
|
63
|
-
|
|
64
|
-
_defineProperty(this, "callQueue", []);
|
|
65
|
-
|
|
66
|
-
_defineProperty(this, "ending", false);
|
|
67
|
-
|
|
68
|
-
_defineProperty(this, "localWorker", void 0);
|
|
69
|
-
|
|
70
|
-
_defineProperty(this, "options", void 0);
|
|
71
|
-
|
|
72
|
-
_defineProperty(this, "run", void 0);
|
|
73
|
-
|
|
74
|
-
_defineProperty(this, "warmWorkers", 0);
|
|
75
|
-
|
|
76
|
-
_defineProperty(this, "workers", new Map());
|
|
77
|
-
|
|
78
|
-
_defineProperty(this, "handles", new Map());
|
|
79
|
-
|
|
80
|
-
_defineProperty(this, "sharedReferences", new Map());
|
|
81
|
-
|
|
82
|
-
_defineProperty(this, "sharedReferencesByValue", new Map());
|
|
83
|
-
|
|
84
|
-
_defineProperty(this, "profiler", void 0);
|
|
85
|
-
|
|
86
|
-
_defineProperty(this, "workerApi", {
|
|
87
|
-
callMaster: async (request, awaitResponse = true) => {
|
|
88
|
-
// $FlowFixMe
|
|
89
|
-
let result = await this.processRequest(_objectSpread({}, request, {
|
|
90
|
-
awaitResponse
|
|
91
|
-
}));
|
|
92
|
-
return (0, _core.deserialize)((0, _core.serialize)(result));
|
|
93
|
-
},
|
|
94
|
-
createReverseHandle: fn => this.createReverseHandle(fn),
|
|
95
|
-
callChild: (childId, request) => new Promise((resolve, reject) => {
|
|
96
|
-
(0, _nullthrows.default)(this.workers.get(childId)).call(_objectSpread({}, request, {
|
|
97
|
-
resolve,
|
|
98
|
-
reject,
|
|
99
|
-
retries: 0
|
|
100
|
-
}));
|
|
101
|
-
}),
|
|
102
|
-
getSharedReference: ref => this.sharedReferences.get(ref),
|
|
103
|
-
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
this.options = _objectSpread({
|
|
121
|
+
this.options = {
|
|
107
122
|
maxConcurrentWorkers: WorkerFarm.getNumWorkers(),
|
|
108
123
|
maxConcurrentCallsPerWorker: WorkerFarm.getConcurrentCallsPerWorker(),
|
|
109
124
|
forcedKillTime: 500,
|
|
110
125
|
warmWorkers: false,
|
|
111
126
|
useLocalWorker: true,
|
|
112
127
|
// TODO: setting this to false makes some tests fail, figure out why
|
|
113
|
-
backend: (0, _backend.detectBackend)()
|
|
114
|
-
|
|
128
|
+
backend: (0, _backend.detectBackend)(),
|
|
129
|
+
...farmOptions
|
|
130
|
+
};
|
|
115
131
|
|
|
116
132
|
if (!this.options.workerPath) {
|
|
117
133
|
throw new Error('Please provide a worker path!');
|
|
@@ -119,10 +135,35 @@ class WorkerFarm extends _events.default {
|
|
|
119
135
|
|
|
120
136
|
|
|
121
137
|
this.localWorker = require(this.options.workerPath);
|
|
138
|
+
this.localWorkerInit = this.localWorker.childInit != null ? this.localWorker.childInit() : null;
|
|
122
139
|
this.run = this.createHandle('run');
|
|
123
140
|
this.startMaxWorkers();
|
|
124
141
|
}
|
|
125
142
|
|
|
143
|
+
workerApi = {
|
|
144
|
+
callMaster: async (request, awaitResponse = true) => {
|
|
145
|
+
// $FlowFixMe
|
|
146
|
+
let result = await this.processRequest({ ...request,
|
|
147
|
+
awaitResponse
|
|
148
|
+
});
|
|
149
|
+
return (0, _core().deserialize)((0, _core().serialize)(result));
|
|
150
|
+
},
|
|
151
|
+
createReverseHandle: fn => this.createReverseHandle(fn),
|
|
152
|
+
callChild: (childId, request) => new Promise((resolve, reject) => {
|
|
153
|
+
(0, _nullthrows().default)(this.workers.get(childId)).call({ ...request,
|
|
154
|
+
resolve,
|
|
155
|
+
reject,
|
|
156
|
+
retries: 0
|
|
157
|
+
});
|
|
158
|
+
}),
|
|
159
|
+
runHandle: (handle, args) => this.workerApi.callChild((0, _nullthrows().default)(handle.childId), {
|
|
160
|
+
handle: handle.id,
|
|
161
|
+
args
|
|
162
|
+
}),
|
|
163
|
+
getSharedReference: ref => this.sharedReferences.get(ref),
|
|
164
|
+
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
|
165
|
+
};
|
|
166
|
+
|
|
126
167
|
warmupWorker(method, args) {
|
|
127
168
|
// Workers are already stopping
|
|
128
169
|
if (this.ending) {
|
|
@@ -149,19 +190,31 @@ class WorkerFarm extends _events.default {
|
|
|
149
190
|
return this.options.maxConcurrentWorkers > 0 || !this.options.useLocalWorker;
|
|
150
191
|
}
|
|
151
192
|
|
|
152
|
-
createHandle(method) {
|
|
153
|
-
return (...args) => {
|
|
193
|
+
createHandle(method, useMainThread = false) {
|
|
194
|
+
return async (...args) => {
|
|
154
195
|
// Child process workers are slow to start (~600ms).
|
|
155
196
|
// While we're waiting, just run on the main thread.
|
|
156
197
|
// This significantly speeds up startup time.
|
|
157
|
-
if (this.shouldUseRemoteWorkers()) {
|
|
198
|
+
if (this.shouldUseRemoteWorkers() && !useMainThread) {
|
|
158
199
|
return this.addCall(method, [...args, false]);
|
|
159
200
|
} else {
|
|
160
201
|
if (this.options.warmWorkers && this.shouldStartRemoteWorkers()) {
|
|
161
202
|
this.warmupWorker(method, args);
|
|
162
203
|
}
|
|
163
204
|
|
|
164
|
-
let processedArgs
|
|
205
|
+
let processedArgs;
|
|
206
|
+
|
|
207
|
+
if (!useMainThread) {
|
|
208
|
+
processedArgs = (0, _core().restoreDeserializedObject)((0, _core().prepareForSerialization)([...args, false]));
|
|
209
|
+
} else {
|
|
210
|
+
processedArgs = args;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (this.localWorkerInit != null) {
|
|
214
|
+
await this.localWorkerInit;
|
|
215
|
+
this.localWorkerInit = null;
|
|
216
|
+
}
|
|
217
|
+
|
|
165
218
|
return this.localWorker[method](this.workerApi, ...processedArgs);
|
|
166
219
|
}
|
|
167
220
|
};
|
|
@@ -171,6 +224,8 @@ class WorkerFarm extends _events.default {
|
|
|
171
224
|
// Handle ipc errors
|
|
172
225
|
if (error.code === 'ERR_IPC_CHANNEL_CLOSED') {
|
|
173
226
|
return this.stopWorker(worker);
|
|
227
|
+
} else {
|
|
228
|
+
_logger().default.error(error, '@parcel/workers');
|
|
174
229
|
}
|
|
175
230
|
}
|
|
176
231
|
|
|
@@ -178,9 +233,10 @@ class WorkerFarm extends _events.default {
|
|
|
178
233
|
let worker = new _Worker.default({
|
|
179
234
|
forcedKillTime: this.options.forcedKillTime,
|
|
180
235
|
backend: this.options.backend,
|
|
181
|
-
|
|
236
|
+
shouldPatchConsole: this.options.shouldPatchConsole,
|
|
237
|
+
sharedReferences: this.sharedReferences
|
|
182
238
|
});
|
|
183
|
-
worker.fork((0, _nullthrows.default)(this.options.workerPath));
|
|
239
|
+
worker.fork((0, _nullthrows().default)(this.options.workerPath));
|
|
184
240
|
worker.on('request', data => this.processRequest(data, worker));
|
|
185
241
|
worker.on('ready', () => this.processQueue());
|
|
186
242
|
worker.on('response', () => this.processQueue());
|
|
@@ -215,7 +271,9 @@ class WorkerFarm extends _events.default {
|
|
|
215
271
|
this.startChild();
|
|
216
272
|
}
|
|
217
273
|
|
|
218
|
-
|
|
274
|
+
let workers = [...this.workers.values()].sort((a, b) => a.calls.size - b.calls.size);
|
|
275
|
+
|
|
276
|
+
for (let worker of workers) {
|
|
219
277
|
if (!this.callQueue.length) {
|
|
220
278
|
break;
|
|
221
279
|
}
|
|
@@ -225,9 +283,19 @@ class WorkerFarm extends _events.default {
|
|
|
225
283
|
}
|
|
226
284
|
|
|
227
285
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
|
228
|
-
|
|
286
|
+
this.callWorker(worker, this.callQueue.shift());
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async callWorker(worker, call) {
|
|
292
|
+
for (let ref of this.sharedReferences.keys()) {
|
|
293
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
|
294
|
+
await worker.sendSharedReference(ref, this.getSerializedSharedReference(ref));
|
|
229
295
|
}
|
|
230
296
|
}
|
|
297
|
+
|
|
298
|
+
worker.call(call);
|
|
231
299
|
}
|
|
232
300
|
|
|
233
301
|
async processRequest(data, worker) {
|
|
@@ -242,7 +310,9 @@ class WorkerFarm extends _events.default {
|
|
|
242
310
|
let mod;
|
|
243
311
|
|
|
244
312
|
if (handleId != null) {
|
|
245
|
-
|
|
313
|
+
var _this$handles$get;
|
|
314
|
+
|
|
315
|
+
mod = (0, _nullthrows().default)((_this$handles$get = this.handles.get(handleId)) === null || _this$handles$get === void 0 ? void 0 : _this$handles$get.fn);
|
|
246
316
|
} else if (location) {
|
|
247
317
|
// $FlowFixMe this must be dynamic
|
|
248
318
|
mod = require(location);
|
|
@@ -261,27 +331,26 @@ class WorkerFarm extends _events.default {
|
|
|
261
331
|
idx,
|
|
262
332
|
type: 'response',
|
|
263
333
|
contentType: 'error',
|
|
264
|
-
content: (0, _diagnostic.anyToDiagnostic)(e)
|
|
334
|
+
content: (0, _diagnostic().anyToDiagnostic)(e)
|
|
265
335
|
});
|
|
266
336
|
|
|
267
337
|
let result;
|
|
268
338
|
|
|
269
339
|
if (method == null) {
|
|
270
340
|
try {
|
|
271
|
-
result = responseFromContent(
|
|
341
|
+
result = responseFromContent(await mod(...args));
|
|
272
342
|
} catch (e) {
|
|
273
343
|
result = errorResponseFromError(e);
|
|
274
344
|
}
|
|
275
345
|
} else {
|
|
276
346
|
// ESModule default interop
|
|
277
|
-
// $FlowFixMe
|
|
278
347
|
if (mod.__esModule && !mod[method] && mod.default) {
|
|
279
348
|
mod = mod.default;
|
|
280
349
|
}
|
|
281
350
|
|
|
282
351
|
try {
|
|
283
352
|
// $FlowFixMe
|
|
284
|
-
result = responseFromContent(
|
|
353
|
+
result = responseFromContent(await mod[method](...args));
|
|
285
354
|
} catch (e) {
|
|
286
355
|
result = errorResponseFromError(e);
|
|
287
356
|
}
|
|
@@ -292,7 +361,7 @@ class WorkerFarm extends _events.default {
|
|
|
292
361
|
worker.send(result);
|
|
293
362
|
} else {
|
|
294
363
|
if (result.contentType === 'error') {
|
|
295
|
-
throw new _diagnostic.default({
|
|
364
|
+
throw new (_diagnostic().default)({
|
|
296
365
|
diagnostic: result.content
|
|
297
366
|
});
|
|
298
367
|
}
|
|
@@ -321,6 +390,7 @@ class WorkerFarm extends _events.default {
|
|
|
321
390
|
|
|
322
391
|
async end() {
|
|
323
392
|
this.ending = true;
|
|
393
|
+
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
|
324
394
|
|
|
325
395
|
for (let handle of this.handles.values()) {
|
|
326
396
|
handle.dispose();
|
|
@@ -329,7 +399,6 @@ class WorkerFarm extends _events.default {
|
|
|
329
399
|
this.handles = new Map();
|
|
330
400
|
this.sharedReferences = new Map();
|
|
331
401
|
this.sharedReferencesByValue = new Map();
|
|
332
|
-
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
|
333
402
|
this.ending = false;
|
|
334
403
|
}
|
|
335
404
|
|
|
@@ -350,46 +419,42 @@ class WorkerFarm extends _events.default {
|
|
|
350
419
|
|
|
351
420
|
createReverseHandle(fn) {
|
|
352
421
|
let handle = new _Handle.default({
|
|
353
|
-
fn
|
|
354
|
-
workerApi: this.workerApi
|
|
422
|
+
fn
|
|
355
423
|
});
|
|
356
424
|
this.handles.set(handle.id, handle);
|
|
357
425
|
return handle;
|
|
358
426
|
}
|
|
359
427
|
|
|
360
|
-
|
|
428
|
+
createSharedReference(value, isCacheable = true) {
|
|
361
429
|
let ref = referenceId++;
|
|
362
430
|
this.sharedReferences.set(ref, value);
|
|
363
431
|
this.sharedReferencesByValue.set(value, ref);
|
|
364
|
-
let promises = [];
|
|
365
432
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
worker.call({
|
|
369
|
-
method: 'createSharedReference',
|
|
370
|
-
args: [ref, value],
|
|
371
|
-
resolve,
|
|
372
|
-
reject,
|
|
373
|
-
retries: 0
|
|
374
|
-
});
|
|
375
|
-
}));
|
|
433
|
+
if (!isCacheable) {
|
|
434
|
+
this.serializedSharedReferences.set(ref, null);
|
|
376
435
|
}
|
|
377
436
|
|
|
378
|
-
await Promise.all(promises);
|
|
379
437
|
return {
|
|
380
438
|
ref,
|
|
381
439
|
dispose: () => {
|
|
382
440
|
this.sharedReferences.delete(ref);
|
|
383
441
|
this.sharedReferencesByValue.delete(value);
|
|
442
|
+
this.serializedSharedReferences.delete(ref);
|
|
384
443
|
let promises = [];
|
|
385
444
|
|
|
386
445
|
for (let worker of this.workers.values()) {
|
|
446
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
worker.sentSharedReferences.delete(ref);
|
|
387
451
|
promises.push(new Promise((resolve, reject) => {
|
|
388
452
|
worker.call({
|
|
389
453
|
method: 'deleteSharedReference',
|
|
390
454
|
args: [ref],
|
|
391
455
|
resolve,
|
|
392
456
|
reject,
|
|
457
|
+
skipReadyCheck: true,
|
|
393
458
|
retries: 0
|
|
394
459
|
});
|
|
395
460
|
}));
|
|
@@ -400,6 +465,24 @@ class WorkerFarm extends _events.default {
|
|
|
400
465
|
};
|
|
401
466
|
}
|
|
402
467
|
|
|
468
|
+
getSerializedSharedReference(ref) {
|
|
469
|
+
let cached = this.serializedSharedReferences.get(ref);
|
|
470
|
+
|
|
471
|
+
if (cached) {
|
|
472
|
+
return cached;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
let value = this.sharedReferences.get(ref);
|
|
476
|
+
let buf = (0, _core().serialize)(value).buffer; // If the reference was created with the isCacheable option set to false,
|
|
477
|
+
// serializedSharedReferences will contain `null` as the value.
|
|
478
|
+
|
|
479
|
+
if (cached !== null) {
|
|
480
|
+
this.serializedSharedReferences.set(ref, buf);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return buf;
|
|
484
|
+
}
|
|
485
|
+
|
|
403
486
|
async startProfile() {
|
|
404
487
|
let promises = [];
|
|
405
488
|
|
|
@@ -410,7 +493,8 @@ class WorkerFarm extends _events.default {
|
|
|
410
493
|
args: [],
|
|
411
494
|
resolve,
|
|
412
495
|
reject,
|
|
413
|
-
retries: 0
|
|
496
|
+
retries: 0,
|
|
497
|
+
skipReadyCheck: true
|
|
414
498
|
});
|
|
415
499
|
}));
|
|
416
500
|
}
|
|
@@ -436,15 +520,16 @@ class WorkerFarm extends _events.default {
|
|
|
436
520
|
args: [],
|
|
437
521
|
resolve,
|
|
438
522
|
reject,
|
|
439
|
-
retries: 0
|
|
523
|
+
retries: 0,
|
|
524
|
+
skipReadyCheck: true
|
|
440
525
|
});
|
|
441
526
|
}));
|
|
442
527
|
}
|
|
443
528
|
|
|
444
529
|
var profiles = await Promise.all(promises);
|
|
445
530
|
let trace = new _Trace.default();
|
|
446
|
-
let filename = `profile-${
|
|
447
|
-
let stream = trace.pipe(_fs.default.createWriteStream(filename));
|
|
531
|
+
let filename = `profile-${getTimeId()}.trace`;
|
|
532
|
+
let stream = trace.pipe(_fs().default.createWriteStream(filename));
|
|
448
533
|
|
|
449
534
|
for (let profile of profiles) {
|
|
450
535
|
trace.addCPUProfile(names.shift(), profile);
|
|
@@ -455,14 +540,60 @@ class WorkerFarm extends _events.default {
|
|
|
455
540
|
stream.once('finish', resolve);
|
|
456
541
|
});
|
|
457
542
|
|
|
458
|
-
_logger.default.info({
|
|
543
|
+
_logger().default.info({
|
|
459
544
|
origin: '@parcel/workers',
|
|
460
|
-
message: `Wrote profile to ${filename}`
|
|
545
|
+
message: (0, _diagnostic().md)`Wrote profile to ${filename}`
|
|
461
546
|
});
|
|
462
547
|
}
|
|
463
548
|
|
|
549
|
+
async callAllWorkers(method, args) {
|
|
550
|
+
let promises = [];
|
|
551
|
+
|
|
552
|
+
for (let worker of this.workers.values()) {
|
|
553
|
+
promises.push(new Promise((resolve, reject) => {
|
|
554
|
+
worker.call({
|
|
555
|
+
method,
|
|
556
|
+
args,
|
|
557
|
+
resolve,
|
|
558
|
+
reject,
|
|
559
|
+
retries: 0
|
|
560
|
+
});
|
|
561
|
+
}));
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
promises.push(this.localWorker[method](this.workerApi, ...args));
|
|
565
|
+
await Promise.all(promises);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
async takeHeapSnapshot() {
|
|
569
|
+
let snapshotId = getTimeId();
|
|
570
|
+
|
|
571
|
+
try {
|
|
572
|
+
let snapshotPaths = await Promise.all([...this.workers.values()].map(worker => new Promise((resolve, reject) => {
|
|
573
|
+
worker.call({
|
|
574
|
+
method: 'takeHeapSnapshot',
|
|
575
|
+
args: [snapshotId],
|
|
576
|
+
resolve,
|
|
577
|
+
reject,
|
|
578
|
+
retries: 0,
|
|
579
|
+
skipReadyCheck: true
|
|
580
|
+
});
|
|
581
|
+
})));
|
|
582
|
+
|
|
583
|
+
_logger().default.info({
|
|
584
|
+
origin: '@parcel/workers',
|
|
585
|
+
message: (0, _diagnostic().md)`Wrote heap snapshots to the following paths:\n${snapshotPaths.join('\n')}`
|
|
586
|
+
});
|
|
587
|
+
} catch {
|
|
588
|
+
_logger().default.error({
|
|
589
|
+
origin: '@parcel/workers',
|
|
590
|
+
message: 'Unable to take heap snapshots. Note: requires Node 11.13.0+'
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
464
595
|
static getNumWorkers() {
|
|
465
|
-
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : (0, _cpuCount.default)();
|
|
596
|
+
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : Math.ceil((0, _cpuCount.default)() / 2);
|
|
466
597
|
}
|
|
467
598
|
|
|
468
599
|
static isWorker() {
|
|
@@ -470,14 +601,19 @@ class WorkerFarm extends _events.default {
|
|
|
470
601
|
}
|
|
471
602
|
|
|
472
603
|
static getWorkerApi() {
|
|
473
|
-
(0, _assert.default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
|
604
|
+
(0, _assert().default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
|
474
605
|
return _childState.child.workerApi;
|
|
475
606
|
}
|
|
476
607
|
|
|
477
608
|
static getConcurrentCallsPerWorker() {
|
|
478
|
-
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) ||
|
|
609
|
+
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) || 30;
|
|
479
610
|
}
|
|
480
611
|
|
|
481
612
|
}
|
|
482
613
|
|
|
483
|
-
exports.default = WorkerFarm;
|
|
614
|
+
exports.default = WorkerFarm;
|
|
615
|
+
|
|
616
|
+
function getTimeId() {
|
|
617
|
+
let now = new Date();
|
|
618
|
+
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');
|
|
619
|
+
}
|
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({
|