- /**
- *
- * @return {Promise<void>}
- * @public
- */
- public async addElement(elementData: WorkerData): Promise<void> {
- if (!this.workers) {
- throw Error('Cannot add a WorkerSet element: workers\' set does not exist');
- }
- if (this.getLastWorkerSetElement().numberOfWorkerElements >= this.maxElementsPerWorker) {
- this.startWorker();
- // Start worker sequentially to optimize memory at startup
- await Utils.sleep(Constants.START_WORKER_DELAY);
+ get size (): number {
+ return this.workerSet.size
+ }
+
+ get maxElementsPerWorker (): number | undefined {
+ return this.workerOptions.elementsPerWorker
+ }
+
+ /** @inheritDoc */
+ public async start (): Promise<void> {
+ this.addWorkerSetElement()
+ // Add worker set element sequentially to optimize memory at startup
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ this.workerOptions.workerStartDelay! > 0 &&
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ (await sleep(randomizeDelay(this.workerOptions.workerStartDelay!)))
+ this.emitter?.emit(WorkerSetEvents.started, this.info)
+ this.started = true
+ }
+
+ /** @inheritDoc */
+ public async stop (): Promise<void> {
+ for (const workerSetElement of this.workerSet) {
+ const worker = workerSetElement.worker
+ const waitWorkerExit = new Promise<void>(resolve => {
+ worker.once('exit', () => {
+ resolve()
+ })
+ })
+ await worker.terminate()
+ await waitWorkerExit
+ this.emitter?.emit(WorkerSetEvents.stopped, this.info)
+ this.emitter?.emitDestroy()
+ this.emitter?.removeAllListeners()
+ this.started = false