a9aa56f09765912a3a4193bb8acc299654d1d3a2
1 import { DynamicThreadPool
, 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 WorkerDynamicPool
<T
> extends WorkerAbstract
{
10 private pool
: DynamicPool
;
13 * Create a new `WorkerDynamicPool`.
15 * @param {string} workerScript
19 constructor(workerScript
: string, min
: number, max
: number,) {
21 this.pool
= DynamicPool
.getInstance(min
, max
, this.workerScript
);
25 return this.pool
.workers
.length
;
28 get
maxElementsPerWorker(): number {
34 * @returns {Promise<void>}
37 // eslint-disable-next-line @typescript-eslint/no-empty-function
38 public async start(): Promise
<void> { }
42 * @returns {Promise<void>}
45 // eslint-disable-next-line @typescript-eslint/require-await
46 public async stop(): Promise
<void> {
47 return this.pool
.destroy();
53 * @returns {Promise<void>}
56 public async addElement(elementData
: T
): Promise
<void> {
57 await this.pool
.execute(elementData
);
58 // Start worker sequentially to optimize memory at startup
59 await Utils
.sleep(Constants
.START_WORKER_DELAY
);
63 class DynamicPool
extends DynamicThreadPool
<WorkerData
> {
64 private static instance
: DynamicPool
;
66 private constructor(min
: number, max
: number, workerScript
: string, opts
?: PoolOptions
<Worker
>) {
67 super(min
, max
, workerScript
, opts
);
70 public static getInstance(min
: number, max
: number, workerScript
: string): DynamicPool
{
71 if (!DynamicPool
.instance
) {
72 DynamicPool
.instance
= new DynamicPool(min
, max
, workerScript
,
74 exitHandler
: (code
) => {
76 console
.error(`Worker stopped with exit code ${code}`);
82 return DynamicPool
.instance
;