]> Piment Noir Git Repositories - poolifier.git/blame - src/pools/thread/fixed.ts
perf: remove unneeded null check at building abortable task function
[poolifier.git] / src / pools / thread / fixed.ts
CommitLineData
fc3e6586 1import {
ded253e2 2 isMainThread,
a1c3f741 3 type Transferable,
3a502712 4 type Worker,
fc3e6586 5} from 'node:worker_threads'
ded253e2 6
d35e5717 7import type { MessageValue } from '../../utility-types.js'
97231086 8
d35e5717
JB
9import { AbstractPool } from '../abstract-pool.js'
10import { type PoolOptions, type PoolType, PoolTypes } from '../pool.js'
11import { type WorkerType, WorkerTypes } from '../worker.js'
4ade5f1f 12
2889bd70
JB
13/**
14 * Options for a poolifier thread pool.
15 */
16export type ThreadPoolOptions = PoolOptions<Worker>
17
4ade5f1f 18/**
729c563d 19 * A thread pool with a fixed number of threads.
e102732c
JB
20 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
21 * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
4ade5f1f
S
22 * @author [Alessandro Pio Ardizio](https://github.com/pioardi)
23 * @since 0.0.1
24 */
d3c8a1a8 25export class FixedThreadPool<
deb85c12
JB
26 Data = unknown,
27 Response = unknown
e102732c 28> extends AbstractPool<Worker, Data, Response> {
5de88a2a
JB
29 /** @inheritDoc */
30 protected get backPressure (): boolean {
31 return this.internalBackPressure()
32 }
33
34 /** @inheritDoc */
35 protected get busy (): boolean {
36 return this.internalBusy()
37 }
38
39 /** @inheritDoc */
40 protected get type (): PoolType {
41 return PoolTypes.fixed
42 }
43
44 /** @inheritDoc */
45 protected get worker (): WorkerType {
46 return WorkerTypes.thread
47 }
48
4ade5f1f 49 /**
729c563d 50 * Constructs a new poolifier fixed thread pool.
38e795c1
JB
51 * @param numberOfThreads - Number of threads for this pool.
52 * @param filePath - Path to an implementation of a `ThreadWorker` file, which can be relative or absolute.
53 * @param opts - Options for this fixed thread pool.
937e8172 54 * @param maximumNumberOfThreads - The maximum number of threads for this pool.
4ade5f1f
S
55 */
56 public constructor (
5c5a1fb7 57 numberOfThreads: number,
c97c7edb 58 filePath: string,
2889bd70 59 opts: ThreadPoolOptions = {},
26ce26ca 60 maximumNumberOfThreads?: number
4ade5f1f 61 ) {
26ce26ca 62 super(numberOfThreads, filePath, opts, maximumNumberOfThreads)
c97c7edb 63 }
4ade5f1f 64
afc003b2 65 /** @inheritDoc */
97231086
JB
66 protected checkAndEmitDynamicWorkerCreationEvents (): void {
67 /* noop */
4ade5f1f
S
68 }
69
5f9e9050
JB
70 /** @inheritDoc */
71 protected checkAndEmitDynamicWorkerDestructionEvents (): void {
72 /* noop */
73 }
74
afc003b2 75 /** @inheritDoc */
97231086 76 protected deregisterWorkerMessageListener<Message extends Data | Response>(
aa9eede8 77 workerNodeKey: number,
97231086 78 listener: (message: MessageValue<Message>) => void
aa9eede8 79 ): void {
97231086
JB
80 this.workerNodes[workerNodeKey].messageChannel?.port1.off(
81 'message',
82 listener
72ae84a2 83 )
85aeb3f3
JB
84 }
85
86 /** @inheritDoc */
97231086
JB
87 protected isMain (): boolean {
88 return isMainThread
85aeb3f3
JB
89 }
90
91 /** @inheritDoc */
97231086 92 protected registerOnceWorkerMessageListener<Message extends Data | Response>(
aa9eede8 93 workerNodeKey: number,
85aeb3f3
JB
94 listener: (message: MessageValue<Message>) => void
95 ): void {
97231086 96 this.workerNodes[workerNodeKey].messageChannel?.port1.once(
fa548cda
JB
97 'message',
98 listener
99 )
4ade5f1f
S
100 }
101
ae036c3e 102 /** @inheritDoc */
97231086 103 protected registerWorkerMessageListener<Message extends Data | Response>(
ae036c3e
JB
104 workerNodeKey: number,
105 listener: (message: MessageValue<Message>) => void
106 ): void {
97231086 107 this.workerNodes[workerNodeKey].messageChannel?.port1.on(
fa548cda
JB
108 'message',
109 listener
110 )
ae036c3e
JB
111 }
112
113 /** @inheritDoc */
97231086
JB
114 protected sendStartupMessageToWorker (workerNodeKey: number): void {
115 const workerNode = this.workerNodes[workerNodeKey]
116 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
117 const port2 = workerNode.messageChannel!.port2
118 workerNode.worker.postMessage(
119 {
120 port: port2,
121 ready: false,
122 workerId: this.getWorkerInfo(workerNodeKey)?.id,
123 } satisfies MessageValue<Data>,
124 [port2]
125 )
126 }
127
128 /** @inheritDoc */
129 protected sendToWorker (
ae036c3e 130 workerNodeKey: number,
97231086 131 message: MessageValue<Data>,
a1c3f741 132 transferList?: readonly Transferable[]
ae036c3e 133 ): void {
97231086
JB
134 this.workerNodes[workerNodeKey]?.messageChannel?.port1.postMessage(
135 {
136 ...message,
137 workerId: this.getWorkerInfo(workerNodeKey)?.id,
138 } satisfies MessageValue<Data>,
139 transferList
fa548cda 140 )
ae036c3e
JB
141 }
142
9d9fb7b6
JB
143 /** @inheritDoc */
144 protected shallCreateDynamicWorker (): boolean {
145 return false
146 }
4ade5f1f 147}