Initial comment conversion to TSDoc
[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
26 for (const worker of this.pool.workers) {
1399f858
JB
27 const workerRunningTasks = this.pool.getWorkerRunningTasks(
28 worker
29 ) as number
78cea37e 30 if (!this.isDynamicPool && workerRunningTasks === 0) {
bdaf31cd 31 return worker
1399f858 32 } else if (workerRunningTasks < minNumberOfRunningTasks) {
bdaf31cd
JB
33 lessRecentlyUsedWorker = worker
34 minNumberOfRunningTasks = workerRunningTasks
35 }
36 }
37 return lessRecentlyUsedWorker
38 }
39}