Add dynamic worker choice strategy change at runtime
[poolifier.git] / src / pools / selection-strategies / less-recently-used-worker-choice-strategy.ts
1 import type { AbstractPoolWorker } from '../abstract-pool-worker'
2 import { 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 */
11 export class LessRecentlyUsedWorkerChoiceStrategy<
12 Worker extends AbstractPoolWorker,
13 Data,
14 Response
15 > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
16 /** @inheritdoc */
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) {
22 const workerRunningTasks = this.pool.getWorkerRunningTasks(worker)
23 if (!this.isDynamicPool && workerRunningTasks === 0) {
24 return worker
25 } else if (
26 workerRunningTasks !== undefined &&
27 workerRunningTasks < minNumberOfRunningTasks
28 ) {
29 lessRecentlyUsedWorker = worker
30 minNumberOfRunningTasks = workerRunningTasks
31 }
32 }
33 return lessRecentlyUsedWorker
34 }
35 }