de1f5b29cfb89aebc39240584f9ed045ee6b1efb
1 import type { Worker
} from
'node:worker_threads';
3 import { type ErrorHandler
, type ExitHandler
, FixedThreadPool
} from
'poolifier';
5 import { WorkerAbstract
} from
'./WorkerAbstract';
6 import type { WorkerData
, WorkerOptions
} from
'./WorkerTypes';
7 import { WorkerUtils
} from
'./WorkerUtils';
9 export class WorkerStaticPool
extends WorkerAbstract
<WorkerData
> {
10 private readonly pool
: FixedThreadPool
<WorkerData
>;
13 * Create a new `WorkerStaticPool`.
15 * @param workerScript -
16 * @param workerOptions -
18 constructor(workerScript
: string, workerOptions
?: WorkerOptions
) {
19 super(workerScript
, workerOptions
);
20 this.workerOptions
.poolOptions
.errorHandler
= (
21 this.workerOptions
?.poolOptions
?.errorHandler
?? WorkerUtils
.defaultErrorHandler
22 ).bind(this) as ErrorHandler
<Worker
>;
23 this.workerOptions
.poolOptions
.exitHandler
= (
24 this.workerOptions
?.poolOptions
?.exitHandler
?? WorkerUtils
.defaultExitHandler
25 ).bind(this) as ExitHandler
<Worker
>;
26 this.workerOptions
.poolOptions
.messageHandler
.bind(this);
27 this.pool
= new FixedThreadPool(
28 this.workerOptions
.poolMaxSize
,
30 this.workerOptions
.poolOptions
35 return this.pool
.workerNodes
.length
;
38 get
maxElementsPerWorker(): number | undefined {
47 public async start(): Promise
<void> {
48 // This is intentional
56 public async stop(): Promise
<void> {
57 return this.pool
.destroy();
62 * @param elementData -
66 public async addElement(elementData
: WorkerData
): Promise
<void> {
67 await this.pool
.execute(elementData
);
68 // Start element sequentially to optimize memory at startup
69 this.workerOptions
.elementStartDelay
> 0 &&
70 (await WorkerUtils
.sleep(this.workerOptions
.elementStartDelay
));