@parcel/workers 2.6.2 → 2.8.0
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/lib/Worker.js +2 -1
- package/lib/WorkerFarm.js +48 -14
- package/lib/child.js +1 -2
- package/package.json +7 -7
- package/src/Worker.js +2 -1
- package/src/WorkerFarm.js +55 -20
- package/src/child.js +0 -1
package/lib/Worker.js
CHANGED
@@ -43,7 +43,7 @@ let WORKER_ID = 0;
|
|
43
43
|
|
44
44
|
class Worker extends _events().default {
|
45
45
|
id = WORKER_ID++;
|
46
|
-
|
46
|
+
sentSharedReferences = new Set();
|
47
47
|
calls = new Map();
|
48
48
|
exitCode = null;
|
49
49
|
callId = 0;
|
@@ -129,6 +129,7 @@ class Worker extends _events().default {
|
|
129
129
|
}
|
130
130
|
|
131
131
|
sendSharedReference(ref, value) {
|
132
|
+
this.sentSharedReferences.add(ref);
|
132
133
|
return new Promise((resolve, reject) => {
|
133
134
|
this.call({
|
134
135
|
method: 'createSharedReference',
|
package/lib/WorkerFarm.js
CHANGED
@@ -114,6 +114,7 @@ class WorkerFarm extends _events().default {
|
|
114
114
|
handles = new Map();
|
115
115
|
sharedReferences = new Map();
|
116
116
|
sharedReferencesByValue = new Map();
|
117
|
+
serializedSharedReferences = new Map();
|
117
118
|
|
118
119
|
constructor(farmOptions = {}) {
|
119
120
|
super();
|
@@ -189,19 +190,25 @@ class WorkerFarm extends _events().default {
|
|
189
190
|
return this.options.maxConcurrentWorkers > 0 || !this.options.useLocalWorker;
|
190
191
|
}
|
191
192
|
|
192
|
-
createHandle(method) {
|
193
|
+
createHandle(method, useMainThread = false) {
|
193
194
|
return async (...args) => {
|
194
195
|
// Child process workers are slow to start (~600ms).
|
195
196
|
// While we're waiting, just run on the main thread.
|
196
197
|
// This significantly speeds up startup time.
|
197
|
-
if (this.shouldUseRemoteWorkers()) {
|
198
|
+
if (this.shouldUseRemoteWorkers() && !useMainThread) {
|
198
199
|
return this.addCall(method, [...args, false]);
|
199
200
|
} else {
|
200
201
|
if (this.options.warmWorkers && this.shouldStartRemoteWorkers()) {
|
201
202
|
this.warmupWorker(method, args);
|
202
203
|
}
|
203
204
|
|
204
|
-
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
|
+
}
|
205
212
|
|
206
213
|
if (this.localWorkerInit != null) {
|
207
214
|
await this.localWorkerInit;
|
@@ -276,9 +283,19 @@ class WorkerFarm extends _events().default {
|
|
276
283
|
}
|
277
284
|
|
278
285
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
279
|
-
|
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));
|
280
295
|
}
|
281
296
|
}
|
297
|
+
|
298
|
+
worker.call(call);
|
282
299
|
}
|
283
300
|
|
284
301
|
async processRequest(data, worker) {
|
@@ -408,30 +425,29 @@ class WorkerFarm extends _events().default {
|
|
408
425
|
return handle;
|
409
426
|
}
|
410
427
|
|
411
|
-
|
412
|
-
// in its place.
|
413
|
-
buffer) {
|
428
|
+
createSharedReference(value, isCacheable = true) {
|
414
429
|
let ref = referenceId++;
|
415
430
|
this.sharedReferences.set(ref, value);
|
416
431
|
this.sharedReferencesByValue.set(value, ref);
|
417
|
-
let toSend = buffer ? buffer.buffer : value;
|
418
|
-
let promises = [];
|
419
432
|
|
420
|
-
|
421
|
-
|
422
|
-
promises.push(worker.sendSharedReference(ref, toSend));
|
423
|
-
}
|
433
|
+
if (!isCacheable) {
|
434
|
+
this.serializedSharedReferences.set(ref, null);
|
424
435
|
}
|
425
436
|
|
426
|
-
await Promise.all(promises);
|
427
437
|
return {
|
428
438
|
ref,
|
429
439
|
dispose: () => {
|
430
440
|
this.sharedReferences.delete(ref);
|
431
441
|
this.sharedReferencesByValue.delete(value);
|
442
|
+
this.serializedSharedReferences.delete(ref);
|
432
443
|
let promises = [];
|
433
444
|
|
434
445
|
for (let worker of this.workers.values()) {
|
446
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
447
|
+
continue;
|
448
|
+
}
|
449
|
+
|
450
|
+
worker.sentSharedReferences.delete(ref);
|
435
451
|
promises.push(new Promise((resolve, reject) => {
|
436
452
|
worker.call({
|
437
453
|
method: 'deleteSharedReference',
|
@@ -449,6 +465,24 @@ class WorkerFarm extends _events().default {
|
|
449
465
|
};
|
450
466
|
}
|
451
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
|
+
|
452
486
|
async startProfile() {
|
453
487
|
let promises = [];
|
454
488
|
|
package/lib/child.js
CHANGED
@@ -192,8 +192,7 @@ class Child {
|
|
192
192
|
try {
|
193
193
|
let v8 = require('v8');
|
194
194
|
|
195
|
-
result = responseFromContent(
|
196
|
-
v8.writeHeapSnapshot('heap-' + args[0] + '-' + (this.childId ? 'worker' + this.childId : 'main') + '.heapsnapshot'));
|
195
|
+
result = responseFromContent(v8.writeHeapSnapshot('heap-' + args[0] + '-' + (this.childId ? 'worker' + this.childId : 'main') + '.heapsnapshot'));
|
197
196
|
} catch (e) {
|
198
197
|
result = errorResponseFromError(e);
|
199
198
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@parcel/workers",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.8.0",
|
4
4
|
"description": "Blazing fast, zero configuration web application bundler",
|
5
5
|
"license": "MIT",
|
6
6
|
"publishConfig": {
|
@@ -21,20 +21,20 @@
|
|
21
21
|
"node": ">= 12.0.0"
|
22
22
|
},
|
23
23
|
"dependencies": {
|
24
|
-
"@parcel/diagnostic": "2.
|
25
|
-
"@parcel/logger": "2.
|
26
|
-
"@parcel/types": "2.
|
27
|
-
"@parcel/utils": "2.
|
24
|
+
"@parcel/diagnostic": "2.8.0",
|
25
|
+
"@parcel/logger": "2.8.0",
|
26
|
+
"@parcel/types": "2.8.0",
|
27
|
+
"@parcel/utils": "2.8.0",
|
28
28
|
"chrome-trace-event": "^1.0.2",
|
29
29
|
"nullthrows": "^1.1.1"
|
30
30
|
},
|
31
31
|
"peerDependencies": {
|
32
|
-
"@parcel/core": "^2.
|
32
|
+
"@parcel/core": "^2.8.0"
|
33
33
|
},
|
34
34
|
"browser": {
|
35
35
|
"./src/cpuCount.js": false,
|
36
36
|
"./src/process/ProcessWorker.js": false,
|
37
37
|
"./src/threads/ThreadsWorker.js": false
|
38
38
|
},
|
39
|
-
"gitHead": "
|
39
|
+
"gitHead": "c3bbe0a6160186f496ca2f9e9bead9376c0522f1"
|
40
40
|
}
|
package/src/Worker.js
CHANGED
@@ -31,7 +31,7 @@ export default class Worker extends EventEmitter {
|
|
31
31
|
+options: WorkerOpts;
|
32
32
|
worker: WorkerImpl;
|
33
33
|
id: number = WORKER_ID++;
|
34
|
-
|
34
|
+
sentSharedReferences: Set<SharedReference> = new Set();
|
35
35
|
|
36
36
|
calls: Map<number, WorkerCall> = new Map();
|
37
37
|
exitCode: ?number = null;
|
@@ -135,6 +135,7 @@ export default class Worker extends EventEmitter {
|
|
135
135
|
}
|
136
136
|
|
137
137
|
sendSharedReference(ref: SharedReference, value: mixed): Promise<any> {
|
138
|
+
this.sentSharedReferences.add(ref);
|
138
139
|
return new Promise((resolve, reject) => {
|
139
140
|
this.call({
|
140
141
|
method: 'createSharedReference',
|
package/src/WorkerFarm.js
CHANGED
@@ -76,6 +76,7 @@ export default class WorkerFarm extends EventEmitter {
|
|
76
76
|
handles: Map<number, Handle> = new Map();
|
77
77
|
sharedReferences: Map<SharedReference, mixed> = new Map();
|
78
78
|
sharedReferencesByValue: Map<mixed, SharedReference> = new Map();
|
79
|
+
serializedSharedReferences: Map<SharedReference, ?ArrayBuffer> = new Map();
|
79
80
|
profiler: ?Profiler;
|
80
81
|
|
81
82
|
constructor(farmOptions: $Shape<FarmOptions> = {}) {
|
@@ -175,21 +176,26 @@ export default class WorkerFarm extends EventEmitter {
|
|
175
176
|
);
|
176
177
|
}
|
177
178
|
|
178
|
-
createHandle(method: string): HandleFunction {
|
179
|
+
createHandle(method: string, useMainThread: boolean = false): HandleFunction {
|
179
180
|
return async (...args) => {
|
180
181
|
// Child process workers are slow to start (~600ms).
|
181
182
|
// While we're waiting, just run on the main thread.
|
182
183
|
// This significantly speeds up startup time.
|
183
|
-
if (this.shouldUseRemoteWorkers()) {
|
184
|
+
if (this.shouldUseRemoteWorkers() && !useMainThread) {
|
184
185
|
return this.addCall(method, [...args, false]);
|
185
186
|
} else {
|
186
187
|
if (this.options.warmWorkers && this.shouldStartRemoteWorkers()) {
|
187
188
|
this.warmupWorker(method, args);
|
188
189
|
}
|
189
190
|
|
190
|
-
let processedArgs
|
191
|
-
|
192
|
-
|
191
|
+
let processedArgs;
|
192
|
+
if (!useMainThread) {
|
193
|
+
processedArgs = restoreDeserializedObject(
|
194
|
+
prepareForSerialization([...args, false]),
|
195
|
+
);
|
196
|
+
} else {
|
197
|
+
processedArgs = args;
|
198
|
+
}
|
193
199
|
|
194
200
|
if (this.localWorkerInit != null) {
|
195
201
|
await this.localWorkerInit;
|
@@ -273,11 +279,24 @@ export default class WorkerFarm extends EventEmitter {
|
|
273
279
|
}
|
274
280
|
|
275
281
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
276
|
-
|
282
|
+
this.callWorker(worker, this.callQueue.shift());
|
277
283
|
}
|
278
284
|
}
|
279
285
|
}
|
280
286
|
|
287
|
+
async callWorker(worker: Worker, call: WorkerCall): Promise<void> {
|
288
|
+
for (let ref of this.sharedReferences.keys()) {
|
289
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
290
|
+
await worker.sendSharedReference(
|
291
|
+
ref,
|
292
|
+
this.getSerializedSharedReference(ref),
|
293
|
+
);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
worker.call(call);
|
298
|
+
}
|
299
|
+
|
281
300
|
async processRequest(
|
282
301
|
data: {|
|
283
302
|
location: FilePath,
|
@@ -400,33 +419,31 @@ export default class WorkerFarm extends EventEmitter {
|
|
400
419
|
return handle;
|
401
420
|
}
|
402
421
|
|
403
|
-
|
422
|
+
createSharedReference(
|
404
423
|
value: mixed,
|
405
|
-
|
406
|
-
|
407
|
-
buffer?: Buffer,
|
408
|
-
): Promise<{|ref: SharedReference, dispose(): Promise<mixed>|}> {
|
424
|
+
isCacheable: boolean = true,
|
425
|
+
): {|ref: SharedReference, dispose(): Promise<mixed>|} {
|
409
426
|
let ref = referenceId++;
|
410
427
|
this.sharedReferences.set(ref, value);
|
411
428
|
this.sharedReferencesByValue.set(value, ref);
|
412
|
-
|
413
|
-
|
414
|
-
let promises = [];
|
415
|
-
for (let worker of this.workers.values()) {
|
416
|
-
if (worker.ready) {
|
417
|
-
promises.push(worker.sendSharedReference(ref, toSend));
|
418
|
-
}
|
429
|
+
if (!isCacheable) {
|
430
|
+
this.serializedSharedReferences.set(ref, null);
|
419
431
|
}
|
420
432
|
|
421
|
-
await Promise.all(promises);
|
422
|
-
|
423
433
|
return {
|
424
434
|
ref,
|
425
435
|
dispose: () => {
|
426
436
|
this.sharedReferences.delete(ref);
|
427
437
|
this.sharedReferencesByValue.delete(value);
|
438
|
+
this.serializedSharedReferences.delete(ref);
|
439
|
+
|
428
440
|
let promises = [];
|
429
441
|
for (let worker of this.workers.values()) {
|
442
|
+
if (!worker.sentSharedReferences.has(ref)) {
|
443
|
+
continue;
|
444
|
+
}
|
445
|
+
|
446
|
+
worker.sentSharedReferences.delete(ref);
|
430
447
|
promises.push(
|
431
448
|
new Promise((resolve, reject) => {
|
432
449
|
worker.call({
|
@@ -445,6 +462,24 @@ export default class WorkerFarm extends EventEmitter {
|
|
445
462
|
};
|
446
463
|
}
|
447
464
|
|
465
|
+
getSerializedSharedReference(ref: SharedReference): ArrayBuffer {
|
466
|
+
let cached = this.serializedSharedReferences.get(ref);
|
467
|
+
if (cached) {
|
468
|
+
return cached;
|
469
|
+
}
|
470
|
+
|
471
|
+
let value = this.sharedReferences.get(ref);
|
472
|
+
let buf = serialize(value).buffer;
|
473
|
+
|
474
|
+
// If the reference was created with the isCacheable option set to false,
|
475
|
+
// serializedSharedReferences will contain `null` as the value.
|
476
|
+
if (cached !== null) {
|
477
|
+
this.serializedSharedReferences.set(ref, buf);
|
478
|
+
}
|
479
|
+
|
480
|
+
return buf;
|
481
|
+
}
|
482
|
+
|
448
483
|
async startProfile() {
|
449
484
|
let promises = [];
|
450
485
|
for (let worker of this.workers.values()) {
|