5 } from
'node:worker_threads'
6 import type { MessageValue
} from
'../../utility-types.js'
7 import { AbstractPool
} from
'../abstract-pool.js'
8 import { type PoolOptions
, type PoolType
, PoolTypes
} from
'../pool.js'
9 import { type WorkerType
, WorkerTypes
} from
'../worker.js'
12 * Options for a poolifier thread pool.
14 export type ThreadPoolOptions
= PoolOptions
<Worker
>
17 * A thread pool with a fixed number of threads.
19 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
20 * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
21 * @author [Alessandro Pio Ardizio](https://github.com/pioardi)
24 export class FixedThreadPool
<
27 > extends AbstractPool
<Worker
, Data
, Response
> {
29 * Constructs a new poolifier fixed thread pool.
31 * @param numberOfThreads - Number of threads for this pool.
32 * @param filePath - Path to an implementation of a `ThreadWorker` file, which can be relative or absolute.
33 * @param opts - Options for this fixed thread pool.
36 numberOfThreads
: number,
38 opts
: ThreadPoolOptions
= {},
39 maximumNumberOfThreads
?: number
41 super(numberOfThreads
, filePath
, opts
, maximumNumberOfThreads
)
45 protected isMain (): boolean {
50 protected sendToWorker (
51 workerNodeKey
: number,
52 message
: MessageValue
<Data
>,
53 transferList
?: TransferListItem
[]
55 this.workerNodes
[workerNodeKey
].messageChannel
?.port1
.postMessage(
58 workerId
: this.getWorkerInfo(workerNodeKey
)?.id
59 } satisfies MessageValue
<Data
>,
65 protected sendStartupMessageToWorker (workerNodeKey
: number): void {
66 const workerNode
= this.workerNodes
[workerNodeKey
]
67 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
68 const port2
= workerNode
.messageChannel
!.port2
69 workerNode
.worker
.postMessage(
72 workerId
: this.getWorkerInfo(workerNodeKey
)?.id
,
74 } satisfies MessageValue
<Data
>,
80 protected registerWorkerMessageListener
<Message
extends Data
| Response
>(
81 workerNodeKey
: number,
82 listener
: (message
: MessageValue
<Message
>) => void
84 this.workerNodes
[workerNodeKey
].messageChannel
?.port1
.on(
91 protected registerOnceWorkerMessageListener
<Message
extends Data
| Response
>(
92 workerNodeKey
: number,
93 listener
: (message
: MessageValue
<Message
>) => void
95 this.workerNodes
[workerNodeKey
].messageChannel
?.port1
.once(
102 protected deregisterWorkerMessageListener
<Message
extends Data
| Response
>(
103 workerNodeKey
: number,
104 listener
: (message
: MessageValue
<Message
>) => void
106 this.workerNodes
[workerNodeKey
].messageChannel
?.port1
.off(
113 protected shallCreateDynamicWorker (): boolean {
118 protected checkAndEmitDynamicWorkerCreationEvents (): void {
123 protected get
type (): PoolType
{
124 return PoolTypes
.fixed
128 protected get
worker (): WorkerType
{
129 return WorkerTypes
.thread
133 protected get
busy (): boolean {
134 return this.internalBusy()