Commit | Line | Data |
---|---|---|
f06e48d8 | 1 | import type { IWorker } from '../worker' |
168c526f | 2 | import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy' |
bf90656c JB |
3 | import type { |
4 | IWorkerChoiceStrategy, | |
5 | RequiredStatistics | |
6 | } from './selection-strategies-types' | |
168c526f JB |
7 | |
8 | /** | |
9 | * Selects the less busy worker. | |
10 | * | |
11 | * @typeParam Worker - Type of worker which manages the strategy. | |
12 | * @typeParam Data - Type of data sent to the worker. This can only be serializable data. | |
13 | * @typeParam Response - Type of response of execution. This can only be serializable data. | |
14 | */ | |
15 | export class LessBusyWorkerChoiceStrategy< | |
f06e48d8 | 16 | Worker extends IWorker, |
b2b1d84e JB |
17 | Data = unknown, |
18 | Response = unknown | |
bf90656c JB |
19 | > |
20 | extends AbstractWorkerChoiceStrategy<Worker, Data, Response> | |
17393ac8 | 21 | implements IWorkerChoiceStrategy { |
afc003b2 | 22 | /** @inheritDoc */ |
168c526f | 23 | public readonly requiredStatistics: RequiredStatistics = { |
c6bd2650 | 24 | runTime: true, |
78099a15 JB |
25 | avgRunTime: false, |
26 | medRunTime: false | |
168c526f JB |
27 | } |
28 | ||
afc003b2 | 29 | /** @inheritDoc */ |
168c526f JB |
30 | public reset (): boolean { |
31 | return true | |
32 | } | |
33 | ||
afc003b2 | 34 | /** @inheritDoc */ |
c923ce56 | 35 | public choose (): number { |
f06e48d8 JB |
36 | const freeWorkerNodeKey = this.pool.findFreeWorkerNodeKey() |
37 | if (freeWorkerNodeKey !== -1) { | |
38 | return freeWorkerNodeKey | |
c141008c | 39 | } |
168c526f | 40 | let minRunTime = Infinity |
f06e48d8 JB |
41 | let lessBusyWorkerNodeKey!: number |
42 | for (const [index, workerNode] of this.pool.workerNodes.entries()) { | |
43 | const workerRunTime = workerNode.tasksUsage.runTime | |
cf9c7b65 | 44 | if (workerRunTime === 0) { |
c923ce56 | 45 | return index |
168c526f JB |
46 | } else if (workerRunTime < minRunTime) { |
47 | minRunTime = workerRunTime | |
f06e48d8 | 48 | lessBusyWorkerNodeKey = index |
168c526f JB |
49 | } |
50 | } | |
f06e48d8 | 51 | return lessBusyWorkerNodeKey |
168c526f | 52 | } |
97a2abc3 | 53 | |
afc003b2 | 54 | /** @inheritDoc */ |
f06e48d8 | 55 | public remove (workerNodeKey: number): boolean { |
97a2abc3 JB |
56 | return true |
57 | } | |
168c526f | 58 | } |