1 import { FixedThreadPool
, PoolOptions
} from
'poolifier';
3 import Constants from
'../utils/Constants';
4 import Utils from
'../utils/Utils';
5 import { Worker
} from
'worker_threads';
6 import WorkerAbstract from
'./WorkerAbstract';
7 import { WorkerData
} from
'../types/Worker';
9 export default class WorkerStaticPool
<T
> extends WorkerAbstract
{
10 private pool
: StaticPool
;
13 * Create a new `WorkerStaticPool`.
15 * @param {string} workerScript
16 * @param {number} numberOfThreads
18 constructor(workerScript
: string, numberOfThreads
: number) {
20 this.pool
= StaticPool
.getInstance(numberOfThreads
, this.workerScript
);
24 return this.pool
.workers
.length
;
27 get
maxElementsPerWorker(): number {
33 * @returns {Promise<void>}
36 // eslint-disable-next-line @typescript-eslint/no-empty-function
37 public async start(): Promise
<void> { }
41 * @returns {Promise<void>}
44 public async stop(): Promise
<void> {
45 return this.pool
.destroy();
51 * @returns {Promise<void>}
54 public async addElement(elementData
: T
): Promise
<void> {
55 await this.pool
.execute(elementData
);
56 // Start worker sequentially to optimize memory at startup
57 await Utils
.sleep(Constants
.START_WORKER_DELAY
);
61 class StaticPool
extends FixedThreadPool
<WorkerData
> {
62 private static instance
: StaticPool
;
64 private constructor(numberOfThreads
: number, workerScript
: string, opts
?: PoolOptions
<Worker
>) {
65 super(numberOfThreads
, workerScript
, opts
);
68 public static getInstance(numberOfThreads
: number, workerScript
: string): StaticPool
{
69 if (!StaticPool
.instance
) {
70 StaticPool
.instance
= new StaticPool(numberOfThreads
, workerScript
,
72 exitHandler
: (code
) => {
74 console
.error(`Worker stopped with exit code ${code}`);
80 return StaticPool
.instance
;