X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fselection-strategies%2Fless-recently-used-worker-choice-strategy.ts;h=fc64a74a6bc7e2085b7e623b5ddc222825d019da;hb=3032893add6cc97da7b0600e21df2865ad1f675c;hp=342ca6ebf10fd46274b8f2a78deecd3f1c81be2b;hpb=6ffb8e34e2276cc0e0f5576749e190d1d914b7d4;p=poolifier.git diff --git a/src/pools/selection-strategies/less-recently-used-worker-choice-strategy.ts b/src/pools/selection-strategies/less-recently-used-worker-choice-strategy.ts index 342ca6eb..fc64a74a 100644 --- a/src/pools/selection-strategies/less-recently-used-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/less-recently-used-worker-choice-strategy.ts @@ -4,34 +4,35 @@ import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy' /** * Selects the less recently used worker. * - * @template Worker Type of worker which manages the strategy. - * @template Data Type of data sent to the worker. This can only be serializable data. - * @template Response Type of response of execution. This can only be serializable data. + * @typeParam Worker - Type of worker which manages the strategy. + * @typeParam Data - Type of data sent to the worker. This can only be serializable data. + * @typeParam Response - Type of response of execution. This can only be serializable data. */ export class LessRecentlyUsedWorkerChoiceStrategy< Worker extends IPoolWorker, Data, Response > extends AbstractWorkerChoiceStrategy { - /** @inheritDoc */ + /** {@inheritDoc} */ public reset (): boolean { return true } - /** @inheritDoc */ + /** {@inheritDoc} */ public choose (): Worker { - let minNumberOfRunningTasks = Infinity + let minNumberOfTasks = Infinity // A worker is always found because it picks the one with fewer tasks let lessRecentlyUsedWorker!: Worker - for (const worker of this.pool.workers) { - const workerRunningTasks = this.pool.getWorkerRunningTasks( - worker - ) as number - if (this.isDynamicPool === false && workerRunningTasks === 0) { + for (const value of this.pool.workers.values()) { + const worker = value.worker + const tasksUsage = this.pool.getWorkerTasksUsage(worker) + const workerTasks = + (tasksUsage?.run as number) + (tasksUsage?.running as number) + if (!this.isDynamicPool && workerTasks === 0) { return worker - } else if (workerRunningTasks < minNumberOfRunningTasks) { + } else if (workerTasks < minNumberOfTasks) { + minNumberOfTasks = workerTasks lessRecentlyUsedWorker = worker - minNumberOfRunningTasks = workerRunningTasks } } return lessRecentlyUsedWorker