feat: add less busy worker choice strategy
[poolifier.git] / src / pools / selection-strategies / less-used-worker-choice-strategy.ts
1 import type { IPoolWorker } from '../pool-worker'
2 import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
3
4 /**
5 * Selects the less used worker.
6 *
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.
10 */
11 export class LessUsedWorkerChoiceStrategy<
12 Worker extends IPoolWorker,
13 Data,
14 Response
15 > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
16 /** {@inheritDoc} */
17 public reset (): boolean {
18 return true
19 }
20
21 /** {@inheritDoc} */
22 public choose (): Worker {
23 let minNumberOfTasks = Infinity
24 let lessUsedWorker!: Worker
25 for (const value of this.pool.workers.values()) {
26 const worker = value.worker
27 const tasksUsage = this.pool.getWorkerTasksUsage(worker)
28 const workerTasks =
29 (tasksUsage?.run as number) + (tasksUsage?.running as number)
30 if (!this.isDynamicPool && workerTasks === 0) {
31 return worker
32 } else if (workerTasks < minNumberOfTasks) {
33 minNumberOfTasks = workerTasks
34 lessUsedWorker = worker
35 }
36 }
37 return lessUsedWorker
38 }
39 }