1 import type { Worker
} from
'worker_threads';
3 import { DynamicThreadPool
, type ErrorHandler
, type ExitHandler
} from
'poolifier';
5 import type { WorkerData
, WorkerOptions
} from
'../types/Worker';
6 import Utils from
'../utils/Utils';
7 import WorkerAbstract from
'./WorkerAbstract';
8 import { WorkerUtils
} from
'./WorkerUtils';
10 export default class WorkerDynamicPool
extends WorkerAbstract
<WorkerData
> {
11 private readonly pool
: DynamicThreadPool
<WorkerData
>;
14 * Create a new `WorkerDynamicPool`.
16 * @param workerScript -
17 * @param workerOptions -
19 constructor(workerScript
: string, workerOptions
?: WorkerOptions
) {
20 super(workerScript
, workerOptions
);
21 this.workerOptions
.poolOptions
.errorHandler
= (
22 this.workerOptions
?.poolOptions
?.errorHandler
?? WorkerUtils
.defaultErrorHandler
23 ).bind(this) as ErrorHandler
<Worker
>;
24 this.workerOptions
.poolOptions
.exitHandler
= (
25 this.workerOptions
?.poolOptions
?.exitHandler
?? WorkerUtils
.defaultExitHandler
26 ).bind(this) as ExitHandler
<Worker
>;
27 this.workerOptions
.poolOptions
.messageHandler
.bind(this);
28 this.pool
= new DynamicThreadPool
<WorkerData
>(
29 this.workerOptions
.poolMinSize
,
30 this.workerOptions
.poolMaxSize
,
32 this.workerOptions
.poolOptions
37 return this.pool
.workers
.length
;
40 get
maxElementsPerWorker(): number | null {
49 public async start(): Promise
<void> {
50 // This is intentional
58 public async stop(): Promise
<void> {
59 return this.pool
.destroy();
64 * @param elementData -
68 public async addElement(elementData
: WorkerData
): Promise
<void> {
69 await this.pool
.execute(elementData
);
70 // Start element sequentially to optimize memory at startup
71 this.workerOptions
.elementStartDelay
> 0 &&
72 (await Utils
.sleep(this.workerOptions
.elementStartDelay
));