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
CommitLineData
ea7a90d3 1import type { IPoolWorker } from '../pool-worker'
bdaf31cd
JB
2import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
3
4/**
5 * Selects the less recently used worker.
6 *
38e795c1
JB
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.
bdaf31cd
JB
10 */
11export class LessRecentlyUsedWorkerChoiceStrategy<
ea7a90d3 12 Worker extends IPoolWorker,
bdaf31cd
JB
13 Data,
14 Response
15> extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
38e795c1 16 /** {@inheritDoc} */
a6f7f1b4 17 public reset (): boolean {
ea7a90d3
JB
18 return true
19 }
20
38e795c1 21 /** {@inheritDoc} */
bdaf31cd
JB
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
ffcbbad8
JB
26 for (const value of this.pool.workers.values()) {
27 const worker = value.worker
1399f858
JB
28 const workerRunningTasks = this.pool.getWorkerRunningTasks(
29 worker
30 ) as number
78cea37e 31 if (!this.isDynamicPool && workerRunningTasks === 0) {
bdaf31cd 32 return worker
1399f858 33 } else if (workerRunningTasks < minNumberOfRunningTasks) {
bdaf31cd
JB
34 lessRecentlyUsedWorker = worker
35 minNumberOfRunningTasks = workerRunningTasks
36 }
37 }
38 return lessRecentlyUsedWorker
39 }
40}