1 import { DynamicThreadPool
, PoolOptions
} from
'poolifier';
3 import Utils from
'../utils/Utils';
4 import { Worker
} from
'worker_threads';
5 import WorkerAbstract from
'./WorkerAbstract';
6 import { WorkerData
} from
'../types/Worker';
8 export default class WorkerDynamicPool
<T
> extends WorkerAbstract
{
9 private pool
: DynamicPool
;
12 * Create a new `WorkerDynamicPool`.
14 * @param {string} workerScript
17 * @param {number} workerStartDelay
18 * @param {PoolOptions} opts
20 constructor(workerScript
: string, min
: number, max
: number, workerStartDelay
?: number, opts
?: PoolOptions
<Worker
>) {
21 super(workerScript
, workerStartDelay
);
22 this.pool
= DynamicPool
.getInstance(min
, max
, this.workerScript
, opts
);
26 return this.pool
.workers
.length
;
29 get
maxElementsPerWorker(): number | null {
35 * @returns {Promise<void>}
38 // eslint-disable-next-line @typescript-eslint/no-empty-function
39 public async start(): Promise
<void> { }
43 * @returns {Promise<void>}
46 // eslint-disable-next-line @typescript-eslint/require-await
47 public async stop(): Promise
<void> {
48 return this.pool
.destroy();
53 * @param {T} elementData
54 * @returns {Promise<void>}
57 public async addElement(elementData
: T
): Promise
<void> {
58 await this.pool
.execute(elementData
);
59 // Start worker sequentially to optimize memory at startup
60 await Utils
.sleep(this.workerStartDelay
);
64 class DynamicPool
extends DynamicThreadPool
<WorkerData
> {
65 private static instance
: DynamicPool
;
67 private constructor(min
: number, max
: number, workerScript
: string, opts
?: PoolOptions
<Worker
>) {
68 super(min
, max
, workerScript
, opts
);
71 public static getInstance(min
: number, max
: number, workerScript
: string, opts
?: PoolOptions
<Worker
>): DynamicPool
{
72 if (!DynamicPool
.instance
) {
73 opts
.exitHandler
= opts
?.exitHandler
?? ((code
) => {
75 console
.error(`Worker stopped with exit code ${code}`);
78 DynamicPool
.instance
= new DynamicPool(min
, max
, workerScript
, opts
);
80 return DynamicPool
.instance
;