perf: use a single map to store pool workers and their related data
[poolifier.git] / src / pools / selection-strategies / less-recently-used-worker-choice-strategy.ts
1 import type { IPoolWorker } from '../pool-worker'
2 import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
3
4 /**
5 * Selects the less recently used worker.
6 *
7 * @typeParam Worker - Type of worker which manages the strategy.
8 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
9 * @typeParam Response - Type of response of execution. This can only be serializable data.
10 */
11 export class LessRecentlyUsedWorkerChoiceStrategy<
12 Worker extends IPoolWorker,
13 Data,
14 Response
15 > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
16 /** {@inheritDoc} */
17 public reset (): boolean {
18 return true
19 }
20
21 /** {@inheritDoc} */
22 public choose (): Worker {
23 let minNumberOfRunningTasks = Infinity
24 // A worker is always found because it picks the one with fewer tasks
25 let lessRecentlyUsedWorker!: Worker
26 for (const value of this.pool.workers.values()) {
27 const worker = value.worker
28 const workerRunningTasks = this.pool.getWorkerRunningTasks(
29 worker
30 ) as number
31 if (!this.isDynamicPool && workerRunningTasks === 0) {
32 return worker
33 } else if (workerRunningTasks < minNumberOfRunningTasks) {
34 lessRecentlyUsedWorker = worker
35 minNumberOfRunningTasks = workerRunningTasks
36 }
37 }
38 return lessRecentlyUsedWorker
39 }
40 }