Properly integrate standard JS tools for JS and TS code
[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 *
7 * @template Worker Type of worker which manages the strategy.
8 * @template Data Type of data sent to the worker. This can only be serializable data.
9 * @template Response Type of response of execution. This can only be serializable data.
10 */
11export class LessRecentlyUsedWorkerChoiceStrategy<
ea7a90d3 12 Worker extends IPoolWorker,
bdaf31cd
JB
13 Data,
14 Response
15> extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
ea7a90d3 16 /** @inheritDoc */
a6f7f1b4 17 public reset (): boolean {
ea7a90d3
JB
18 return true
19 }
20
a76fac14 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}