Commit | Line | Data |
---|---|---|
bdaf31cd JB |
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> { | |
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 | } |