50d099d856633ff5cbc8ad6c5d1f57813a750b1e
1 import { WorkerData
, WorkerEvents
, WorkerSetElement
} from
'../types/Worker';
3 import Constants from
'../utils/Constants';
4 import Utils from
'../utils/Utils';
5 import { Worker
} from
'worker_threads';
6 import Wrk from
'./Wrk';
8 export default class WorkerSet
extends Wrk
{
9 public maxElementsPerWorker
: number;
10 private workers
: Set
<WorkerSetElement
>;
13 * Create a new `WorkerSet`.
15 * @param {string} workerScript
16 * @param {number} maxElementsPerWorker
18 constructor(workerScript
: string, maxElementsPerWorker
= 1) {
20 this.workers
= new Set
<WorkerSetElement
>();
21 this.maxElementsPerWorker
= maxElementsPerWorker
;
25 return this.workers
.size
;
30 * @return {Promise<void>}
33 public async addElement(elementData
: WorkerData
): Promise
<void> {
35 throw Error('Cannot add a WorkerSet element: workers set does not exist');
37 if (this.getLastWorkerSetElement().numberOfWorkerElements
>= this.maxElementsPerWorker
) {
38 void this.startWorker();
39 // Start worker sequentially to optimize memory at startup
40 void Utils
.sleep(Constants
.START_WORKER_DELAY
);
42 this.getLastWorker().postMessage({ id
: WorkerEvents
.START_WORKER_ELEMENT
, workerData
: elementData
});
43 this.getLastWorkerSetElement().numberOfWorkerElements
++;
48 * @return {Promise<void>}
51 public async start(): Promise
<void> {
52 await this.startWorker();
53 // Start worker sequentially to optimize memory at startup
54 await Utils
.sleep(Constants
.START_WORKER_DELAY
);
62 private async startWorker() {
63 return new Promise((resolve
, reject
) => {
64 const worker
= new Worker(this.workerScript
);
65 worker
.on('message', resolve
);
66 worker
.on('error', reject
);
67 worker
.on('exit', (code
) => {
69 reject(new Error(`Worker stopped with exit code ${code}`));
72 this.workers
.add({ worker
, numberOfWorkerElements
: 0 });
76 private getLastWorkerSetElement(): WorkerSetElement
{
77 let workerSetElement
: WorkerSetElement
;
78 // eslint-disable-next-line no-empty
79 for (workerSetElement
of this.workers
) { }
80 return workerSetElement
;
83 private getLastWorker(): Worker
{
84 return this.getLastWorkerSetElement().worker
;