@parcel/workers 2.0.0-nightly.122 → 2.0.0-nightly.1221
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 +247 -102
- 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 +210 -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/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,44 @@ class WorkerFarm extends _events.default {
|
|
|
119
135
|
|
|
120
136
|
|
|
121
137
|
this.localWorker = require(this.options.workerPath);
|
|
122
|
-
this.
|
|
138
|
+
this.localWorkerInit = this.localWorker.childInit != null ? this.localWorker.childInit() : null;
|
|
139
|
+
this.run = this.createHandle('run'); // Worker thread stdout is by default piped into the process stdout, if there are enough worker
|
|
140
|
+
// threads to exceed the default listener limit, then anything else piping into stdout will trigger
|
|
141
|
+
// the `MaxListenersExceededWarning`, so we should ensure the max listeners is at least equal to the
|
|
142
|
+
// number of workers + 1 for the main thread.
|
|
143
|
+
//
|
|
144
|
+
// Note this can't be fixed easily where other things pipe into stdout - even after starting > 10 worker
|
|
145
|
+
// threads `process.stdout.getMaxListeners()` will still return 10, however adding another pipe into `stdout`
|
|
146
|
+
// will give the warning with `<worker count + 1>` as the number of listeners.
|
|
147
|
+
|
|
148
|
+
process.stdout.setMaxListeners(Math.max(process.stdout.getMaxListeners(), WorkerFarm.getNumWorkers() + 1));
|
|
123
149
|
this.startMaxWorkers();
|
|
124
150
|
}
|
|
125
151
|
|
|
152
|
+
workerApi = {
|
|
153
|
+
callMaster: async (request, awaitResponse = true) => {
|
|
154
|
+
// $FlowFixMe
|
|
155
|
+
let result = await this.processRequest({ ...request,
|
|
156
|
+
awaitResponse
|
|
157
|
+
});
|
|
158
|
+
return (0, _core().deserialize)((0, _core().serialize)(result));
|
|
159
|
+
},
|
|
160
|
+
createReverseHandle: fn => this.createReverseHandle(fn),
|
|
161
|
+
callChild: (childId, request) => new Promise((resolve, reject) => {
|
|
162
|
+
(0, _nullthrows().default)(this.workers.get(childId)).call({ ...request,
|
|
163
|
+
resolve,
|
|
164
|
+
reject,
|
|
165
|
+
retries: 0
|
|
166
|
+
});
|
|
167
|
+
}),
|
|
168
|
+
runHandle: (handle, args) => this.workerApi.callChild((0, _nullthrows().default)(handle.childId), {
|
|
169
|
+
handle: handle.id,
|
|
170
|
+
args
|
|
171
|
+
}),
|
|
172
|
+
getSharedReference: ref => this.sharedReferences.get(ref),
|
|
173
|
+
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
|
174
|
+
};
|
|
175
|
+
|
|
126
176
|
warmupWorker(method, args) {
|
|
127
177
|
// Workers are already stopping
|
|
128
178
|
if (this.ending) {
|
|
@@ -149,19 +199,31 @@ class WorkerFarm extends _events.default {
|
|
|
149
199
|
return this.options.maxConcurrentWorkers > 0 || !this.options.useLocalWorker;
|
|
150
200
|
}
|
|
151
201
|
|
|
152
|
-
createHandle(method) {
|
|
153
|
-
return (...args) => {
|
|
202
|
+
createHandle(method, useMainThread = false) {
|
|
203
|
+
return async (...args) => {
|
|
154
204
|
// Child process workers are slow to start (~600ms).
|
|
155
205
|
// While we're waiting, just run on the main thread.
|
|
156
206
|
// This significantly speeds up startup time.
|
|
157
|
-
if (this.shouldUseRemoteWorkers()) {
|
|
207
|
+
if (this.shouldUseRemoteWorkers() && !useMainThread) {
|
|
158
208
|
return this.addCall(method, [...args, false]);
|
|
159
209
|
} else {
|
|
160
210
|
if (this.options.warmWorkers && this.shouldStartRemoteWorkers()) {
|
|
161
211
|
this.warmupWorker(method, args);
|
|
162
212
|
}
|
|
163
213
|
|
|
164
|
-
let processedArgs
|
|
214
|
+
let processedArgs;
|
|
215
|
+
|
|
216
|
+
if (!useMainThread) {
|
|
217
|
+
processedArgs = (0, _core().restoreDeserializedObject)((0, _core().prepareForSerialization)([...args, false]));
|
|
218
|
+
} else {
|
|
219
|
+
processedArgs = args;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (this.localWorkerInit != null) {
|
|
223
|
+
await this.localWorkerInit;
|
|
224
|
+
this.localWorkerInit = null;
|
|
225
|
+
}
|
|
226
|
+
|
|
165
227
|
return this.localWorker[method](this.workerApi, ...processedArgs);
|
|
166
228
|
}
|
|
167
229
|
};
|
|
@@ -171,6 +233,8 @@ class WorkerFarm extends _events.default {
|
|
|
171
233
|
// Handle ipc errors
|
|
172
234
|
if (error.code === 'ERR_IPC_CHANNEL_CLOSED') {
|
|
173
235
|
return this.stopWorker(worker);
|
|
236
|
+
} else {
|
|
237
|
+
_logger().default.error(error, '@parcel/workers');
|
|
174
238
|
}
|
|
175
239
|
}
|
|
176
240
|
|
|
@@ -178,9 +242,10 @@ class WorkerFarm extends _events.default {
|
|
|
178
242
|
let worker = new _Worker.default({
|
|
179
243
|
forcedKillTime: this.options.forcedKillTime,
|
|
180
244
|
backend: this.options.backend,
|
|
181
|
-
|
|
245
|
+
shouldPatchConsole: this.options.shouldPatchConsole,
|
|
246
|
+
sharedReferences: this.sharedReferences
|
|
182
247
|
});
|
|
183
|
-
worker.fork((0, _nullthrows.default)(this.options.workerPath));
|
|
248
|
+
worker.fork((0, _nullthrows().default)(this.options.workerPath));
|
|
184
249
|
worker.on('request', data => this.processRequest(data, worker));
|
|
185
250
|
worker.on('ready', () => this.processQueue());
|
|
186
251
|
worker.on('response', () => this.processQueue());
|
|
@@ -215,7 +280,9 @@ class WorkerFarm extends _events.default {
|
|
|
215
280
|
this.startChild();
|
|
216
281
|
}
|
|
217
282
|
|
|
218
|
-
|
|
283
|
+
let workers = [...this.workers.values()].sort((a, b) => a.calls.size - b.calls.size);
|
|
284
|
+
|
|
285
|
+
for (let worker of workers) {
|
|
219
286
|
if (!this.callQueue.length) {
|
|
220
287
|
break;
|
|
221
288
|
}
|
|
@@ -225,9 +292,19 @@ class WorkerFarm extends _events.default {
|
|
|
225
292
|
}
|
|
226
293
|
|
|
227
294
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
|
228
|
-
|
|
295
|
+
this.callWorker(worker, this.callQueue.shift());
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async callWorker(worker, call) {
|
|
301
|
+
for (let ref of this.sharedReferences.keys()) {
|
|
302
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
|
303
|
+
await worker.sendSharedReference(ref, this.getSerializedSharedReference(ref));
|
|
229
304
|
}
|
|
230
305
|
}
|
|
306
|
+
|
|
307
|
+
worker.call(call);
|
|
231
308
|
}
|
|
232
309
|
|
|
233
310
|
async processRequest(data, worker) {
|
|
@@ -242,7 +319,9 @@ class WorkerFarm extends _events.default {
|
|
|
242
319
|
let mod;
|
|
243
320
|
|
|
244
321
|
if (handleId != null) {
|
|
245
|
-
|
|
322
|
+
var _this$handles$get;
|
|
323
|
+
|
|
324
|
+
mod = (0, _nullthrows().default)((_this$handles$get = this.handles.get(handleId)) === null || _this$handles$get === void 0 ? void 0 : _this$handles$get.fn);
|
|
246
325
|
} else if (location) {
|
|
247
326
|
// $FlowFixMe this must be dynamic
|
|
248
327
|
mod = require(location);
|
|
@@ -261,27 +340,26 @@ class WorkerFarm extends _events.default {
|
|
|
261
340
|
idx,
|
|
262
341
|
type: 'response',
|
|
263
342
|
contentType: 'error',
|
|
264
|
-
content: (0, _diagnostic.anyToDiagnostic)(e)
|
|
343
|
+
content: (0, _diagnostic().anyToDiagnostic)(e)
|
|
265
344
|
});
|
|
266
345
|
|
|
267
346
|
let result;
|
|
268
347
|
|
|
269
348
|
if (method == null) {
|
|
270
349
|
try {
|
|
271
|
-
result = responseFromContent(
|
|
350
|
+
result = responseFromContent(await mod(...args));
|
|
272
351
|
} catch (e) {
|
|
273
352
|
result = errorResponseFromError(e);
|
|
274
353
|
}
|
|
275
354
|
} else {
|
|
276
355
|
// ESModule default interop
|
|
277
|
-
// $FlowFixMe
|
|
278
356
|
if (mod.__esModule && !mod[method] && mod.default) {
|
|
279
357
|
mod = mod.default;
|
|
280
358
|
}
|
|
281
359
|
|
|
282
360
|
try {
|
|
283
361
|
// $FlowFixMe
|
|
284
|
-
result = responseFromContent(
|
|
362
|
+
result = responseFromContent(await mod[method](...args));
|
|
285
363
|
} catch (e) {
|
|
286
364
|
result = errorResponseFromError(e);
|
|
287
365
|
}
|
|
@@ -292,7 +370,7 @@ class WorkerFarm extends _events.default {
|
|
|
292
370
|
worker.send(result);
|
|
293
371
|
} else {
|
|
294
372
|
if (result.contentType === 'error') {
|
|
295
|
-
throw new _diagnostic.default({
|
|
373
|
+
throw new (_diagnostic().default)({
|
|
296
374
|
diagnostic: result.content
|
|
297
375
|
});
|
|
298
376
|
}
|
|
@@ -321,6 +399,7 @@ class WorkerFarm extends _events.default {
|
|
|
321
399
|
|
|
322
400
|
async end() {
|
|
323
401
|
this.ending = true;
|
|
402
|
+
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
|
324
403
|
|
|
325
404
|
for (let handle of this.handles.values()) {
|
|
326
405
|
handle.dispose();
|
|
@@ -329,7 +408,6 @@ class WorkerFarm extends _events.default {
|
|
|
329
408
|
this.handles = new Map();
|
|
330
409
|
this.sharedReferences = new Map();
|
|
331
410
|
this.sharedReferencesByValue = new Map();
|
|
332
|
-
await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
|
|
333
411
|
this.ending = false;
|
|
334
412
|
}
|
|
335
413
|
|
|
@@ -350,46 +428,42 @@ class WorkerFarm extends _events.default {
|
|
|
350
428
|
|
|
351
429
|
createReverseHandle(fn) {
|
|
352
430
|
let handle = new _Handle.default({
|
|
353
|
-
fn
|
|
354
|
-
workerApi: this.workerApi
|
|
431
|
+
fn
|
|
355
432
|
});
|
|
356
433
|
this.handles.set(handle.id, handle);
|
|
357
434
|
return handle;
|
|
358
435
|
}
|
|
359
436
|
|
|
360
|
-
|
|
437
|
+
createSharedReference(value, isCacheable = true) {
|
|
361
438
|
let ref = referenceId++;
|
|
362
439
|
this.sharedReferences.set(ref, value);
|
|
363
440
|
this.sharedReferencesByValue.set(value, ref);
|
|
364
|
-
let promises = [];
|
|
365
441
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
worker.call({
|
|
369
|
-
method: 'createSharedReference',
|
|
370
|
-
args: [ref, value],
|
|
371
|
-
resolve,
|
|
372
|
-
reject,
|
|
373
|
-
retries: 0
|
|
374
|
-
});
|
|
375
|
-
}));
|
|
442
|
+
if (!isCacheable) {
|
|
443
|
+
this.serializedSharedReferences.set(ref, null);
|
|
376
444
|
}
|
|
377
445
|
|
|
378
|
-
await Promise.all(promises);
|
|
379
446
|
return {
|
|
380
447
|
ref,
|
|
381
448
|
dispose: () => {
|
|
382
449
|
this.sharedReferences.delete(ref);
|
|
383
450
|
this.sharedReferencesByValue.delete(value);
|
|
451
|
+
this.serializedSharedReferences.delete(ref);
|
|
384
452
|
let promises = [];
|
|
385
453
|
|
|
386
454
|
for (let worker of this.workers.values()) {
|
|
455
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
worker.sentSharedReferences.delete(ref);
|
|
387
460
|
promises.push(new Promise((resolve, reject) => {
|
|
388
461
|
worker.call({
|
|
389
462
|
method: 'deleteSharedReference',
|
|
390
463
|
args: [ref],
|
|
391
464
|
resolve,
|
|
392
465
|
reject,
|
|
466
|
+
skipReadyCheck: true,
|
|
393
467
|
retries: 0
|
|
394
468
|
});
|
|
395
469
|
}));
|
|
@@ -400,6 +474,24 @@ class WorkerFarm extends _events.default {
|
|
|
400
474
|
};
|
|
401
475
|
}
|
|
402
476
|
|
|
477
|
+
getSerializedSharedReference(ref) {
|
|
478
|
+
let cached = this.serializedSharedReferences.get(ref);
|
|
479
|
+
|
|
480
|
+
if (cached) {
|
|
481
|
+
return cached;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
let value = this.sharedReferences.get(ref);
|
|
485
|
+
let buf = (0, _core().serialize)(value).buffer; // If the reference was created with the isCacheable option set to false,
|
|
486
|
+
// serializedSharedReferences will contain `null` as the value.
|
|
487
|
+
|
|
488
|
+
if (cached !== null) {
|
|
489
|
+
this.serializedSharedReferences.set(ref, buf);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return buf;
|
|
493
|
+
}
|
|
494
|
+
|
|
403
495
|
async startProfile() {
|
|
404
496
|
let promises = [];
|
|
405
497
|
|
|
@@ -410,7 +502,8 @@ class WorkerFarm extends _events.default {
|
|
|
410
502
|
args: [],
|
|
411
503
|
resolve,
|
|
412
504
|
reject,
|
|
413
|
-
retries: 0
|
|
505
|
+
retries: 0,
|
|
506
|
+
skipReadyCheck: true
|
|
414
507
|
});
|
|
415
508
|
}));
|
|
416
509
|
}
|
|
@@ -436,15 +529,16 @@ class WorkerFarm extends _events.default {
|
|
|
436
529
|
args: [],
|
|
437
530
|
resolve,
|
|
438
531
|
reject,
|
|
439
|
-
retries: 0
|
|
532
|
+
retries: 0,
|
|
533
|
+
skipReadyCheck: true
|
|
440
534
|
});
|
|
441
535
|
}));
|
|
442
536
|
}
|
|
443
537
|
|
|
444
538
|
var profiles = await Promise.all(promises);
|
|
445
539
|
let trace = new _Trace.default();
|
|
446
|
-
let filename = `profile-${
|
|
447
|
-
let stream = trace.pipe(_fs.default.createWriteStream(filename));
|
|
540
|
+
let filename = `profile-${getTimeId()}.trace`;
|
|
541
|
+
let stream = trace.pipe(_fs().default.createWriteStream(filename));
|
|
448
542
|
|
|
449
543
|
for (let profile of profiles) {
|
|
450
544
|
trace.addCPUProfile(names.shift(), profile);
|
|
@@ -455,14 +549,60 @@ class WorkerFarm extends _events.default {
|
|
|
455
549
|
stream.once('finish', resolve);
|
|
456
550
|
});
|
|
457
551
|
|
|
458
|
-
_logger.default.info({
|
|
552
|
+
_logger().default.info({
|
|
459
553
|
origin: '@parcel/workers',
|
|
460
|
-
message: `Wrote profile to ${filename}`
|
|
554
|
+
message: (0, _diagnostic().md)`Wrote profile to ${filename}`
|
|
461
555
|
});
|
|
462
556
|
}
|
|
463
557
|
|
|
558
|
+
async callAllWorkers(method, args) {
|
|
559
|
+
let promises = [];
|
|
560
|
+
|
|
561
|
+
for (let worker of this.workers.values()) {
|
|
562
|
+
promises.push(new Promise((resolve, reject) => {
|
|
563
|
+
worker.call({
|
|
564
|
+
method,
|
|
565
|
+
args,
|
|
566
|
+
resolve,
|
|
567
|
+
reject,
|
|
568
|
+
retries: 0
|
|
569
|
+
});
|
|
570
|
+
}));
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
promises.push(this.localWorker[method](this.workerApi, ...args));
|
|
574
|
+
await Promise.all(promises);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
async takeHeapSnapshot() {
|
|
578
|
+
let snapshotId = getTimeId();
|
|
579
|
+
|
|
580
|
+
try {
|
|
581
|
+
let snapshotPaths = await Promise.all([...this.workers.values()].map(worker => new Promise((resolve, reject) => {
|
|
582
|
+
worker.call({
|
|
583
|
+
method: 'takeHeapSnapshot',
|
|
584
|
+
args: [snapshotId],
|
|
585
|
+
resolve,
|
|
586
|
+
reject,
|
|
587
|
+
retries: 0,
|
|
588
|
+
skipReadyCheck: true
|
|
589
|
+
});
|
|
590
|
+
})));
|
|
591
|
+
|
|
592
|
+
_logger().default.info({
|
|
593
|
+
origin: '@parcel/workers',
|
|
594
|
+
message: (0, _diagnostic().md)`Wrote heap snapshots to the following paths:\n${snapshotPaths.join('\n')}`
|
|
595
|
+
});
|
|
596
|
+
} catch {
|
|
597
|
+
_logger().default.error({
|
|
598
|
+
origin: '@parcel/workers',
|
|
599
|
+
message: 'Unable to take heap snapshots. Note: requires Node 11.13.0+'
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
464
604
|
static getNumWorkers() {
|
|
465
|
-
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : (0, _cpuCount.default)();
|
|
605
|
+
return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : Math.ceil((0, _cpuCount.default)() / 2);
|
|
466
606
|
}
|
|
467
607
|
|
|
468
608
|
static isWorker() {
|
|
@@ -470,14 +610,19 @@ class WorkerFarm extends _events.default {
|
|
|
470
610
|
}
|
|
471
611
|
|
|
472
612
|
static getWorkerApi() {
|
|
473
|
-
(0, _assert.default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
|
613
|
+
(0, _assert().default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
|
|
474
614
|
return _childState.child.workerApi;
|
|
475
615
|
}
|
|
476
616
|
|
|
477
617
|
static getConcurrentCallsPerWorker() {
|
|
478
|
-
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) ||
|
|
618
|
+
return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) || 30;
|
|
479
619
|
}
|
|
480
620
|
|
|
481
621
|
}
|
|
482
622
|
|
|
483
|
-
exports.default = WorkerFarm;
|
|
623
|
+
exports.default = WorkerFarm;
|
|
624
|
+
|
|
625
|
+
function getTimeId() {
|
|
626
|
+
let now = new Date();
|
|
627
|
+
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');
|
|
628
|
+
}
|
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({
|