X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fselection-strategies.ts;h=034b1612334abe6b83ad1943dd05857e7dad89b7;hb=bd0e5c4dda309d307e83ddfd8a974df631fc21da;hp=692ace93889efb399c83ab04072be95fbb1ad314;hpb=330c983e06cc9711c66fcd0f1bb419e80453c77f;p=poolifier.git diff --git a/src/pools/selection-strategies.ts b/src/pools/selection-strategies.ts index 692ace93..034b1612 100644 --- a/src/pools/selection-strategies.ts +++ b/src/pools/selection-strategies.ts @@ -1,5 +1,6 @@ import type { IWorker } from './abstract-pool' import type { IPoolInternal } from './pool-internal' +import { PoolType } from './pool-internal' /** * Enumeration of worker choice strategies. @@ -89,7 +90,7 @@ class LessRecentlyUsedWorkerChoiceStrategy< /** @inheritdoc */ public choose (): Worker { - const isPoolDynamic = this.pool.dynamic + const isPoolDynamic = this.pool.type === PoolType.DYNAMIC let minNumberOfTasks = Infinity // A worker is always found because it picks the one with fewer tasks let lessRecentlyUsedWorker!: Worker @@ -97,8 +98,8 @@ class LessRecentlyUsedWorkerChoiceStrategy< if (!isPoolDynamic && numberOfTasks === 0) { return worker } else if (numberOfTasks < minNumberOfTasks) { - minNumberOfTasks = numberOfTasks lessRecentlyUsedWorker = worker + minNumberOfTasks = numberOfTasks } } return lessRecentlyUsedWorker @@ -121,7 +122,7 @@ class DynamicPoolWorkerChoiceStrategy * * @param pool The pool instance. * @param createDynamicallyWorkerCallback The worker creation callback for dynamic pool. - * @param workerChoiceStrategy The worker choice strategy when the pull is full. + * @param workerChoiceStrategy The worker choice strategy when the pull is busy. */ public constructor ( private readonly pool: IPoolInternal, @@ -136,15 +137,12 @@ class DynamicPoolWorkerChoiceStrategy /** @inheritdoc */ public choose (): Worker { - const freeWorker = SelectionStrategiesUtils.findFreeWorkerBasedOnTasks( - this.pool.tasks - ) - if (freeWorker) { - return freeWorker + const freeTaskMapEntry = this.pool.findFreeTasksMapEntry() + if (freeTaskMapEntry) { + return freeTaskMapEntry[0] } - if (this.pool.workers.length === this.pool.max) { - this.pool.emitter.emit('busy') + if (this.pool.busy) { return this.workerChoiceStrategy.choose() } @@ -192,7 +190,7 @@ export class WorkerChoiceStrategyContext< private getPoolWorkerChoiceStrategy ( workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN ): IWorkerChoiceStrategy { - if (this.pool.dynamic) { + if (this.pool.type === PoolType.DYNAMIC) { return new DynamicPoolWorkerChoiceStrategy( this.pool, this.createDynamicallyWorkerCallback, @@ -229,31 +227,9 @@ export class WorkerChoiceStrategyContext< } /** - * Worker selection strategies helpers. + * Worker selection strategies helpers class. */ class SelectionStrategiesUtils { - /** - * Find a free worker based on number of tasks the worker has applied. - * - * If a worker was found that has `0` tasks, it is detected as free and will be returned. - * - * If no free worker was found, `null` will be returned. - * - * @param workerTasksMap The pool worker tasks map. - * @returns A free worker if there was one, otherwise `null`. - */ - public static findFreeWorkerBasedOnTasks ( - workerTasksMap: Map - ): Worker | null { - for (const [worker, numberOfTasks] of workerTasksMap) { - if (numberOfTasks === 0) { - // A worker is free, use it - return worker - } - } - return null - } - /** * Get the worker choice strategy instance. *