Generate documentation
[poolifier.git] / src / pools / selection-strategies / less-recently-used-worker-choice-strategy.ts
CommitLineData
bdaf31cd
JB
1import type { AbstractPoolWorker } from '../abstract-pool-worker'
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<
12 Worker extends AbstractPoolWorker,
13 Data,
14 Response
15> extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
a76fac14 16 /** @inheritDoc */
bdaf31cd
JB
17 public choose (): Worker {
18 let minNumberOfRunningTasks = Infinity
19 // A worker is always found because it picks the one with fewer tasks
20 let lessRecentlyUsedWorker!: Worker
21 for (const worker of this.pool.workers) {
1399f858
JB
22 const workerRunningTasks = this.pool.getWorkerRunningTasks(
23 worker
24 ) as number
25 if (this.isDynamicPool === false && workerRunningTasks === 0) {
bdaf31cd 26 return worker
1399f858 27 } else if (workerRunningTasks < minNumberOfRunningTasks) {
bdaf31cd
JB
28 lessRecentlyUsedWorker = worker
29 minNumberOfRunningTasks = workerRunningTasks
30 }
31 }
32 return lessRecentlyUsedWorker
33 }
34}