X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fabstract-pool.ts;h=346eb6d1fdb02cdf992f84b91502ae21f465800e;hb=97c16550808cdcc2350561d6b369efdea3f5263d;hp=369e5b90617bab507d97e36331c00a93d6a47c67;hpb=bdede008ae867784cd6dfa7468a930d7c026177b;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 369e5b90..346eb6d1 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -4,10 +4,10 @@ import type { } from '../utility-types' import { EMPTY_FUNCTION } from '../utils' import { isKillBehavior, KillBehaviors } from '../worker/worker-options' -import type { AbstractPoolWorker } from './abstract-pool-worker' import type { PoolOptions } from './pool' import type { IPoolInternal, TasksUsage } from './pool-internal' import { PoolEmitter, PoolType } from './pool-internal' +import type { IPoolWorker } from './pool-worker' import { WorkerChoiceStrategies, WorkerChoiceStrategy @@ -18,27 +18,22 @@ const WORKER_NOT_FOUND_TASKS_USAGE_MAP = 'Worker could not be found in worker tasks usage map' /** - * Base class containing some shared logic for all poolifier pools. + * Base class that implements some shared logic for all poolifier pools. * * @template Worker Type of worker which manages this pool. * @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. */ export abstract class AbstractPool< - Worker extends AbstractPoolWorker, + Worker extends IPoolWorker, Data = unknown, Response = unknown > implements IPoolInternal { /** @inheritDoc */ public readonly workers: Worker[] = [] - /** - * The workers tasks usage map. - * - * `key`: The `Worker` - * `value`: Worker tasks usage statistics. - */ - protected workersTasksUsage: Map = new Map< + /** @inheritDoc */ + public readonly workersTasksUsage: Map = new Map< Worker, TasksUsage >() @@ -90,7 +85,7 @@ export abstract class AbstractPool< public readonly filePath: string, public readonly opts: PoolOptions ) { - if (!this.isMain()) { + if (this.isMain() === false) { throw new Error('Cannot start a pool from a worker!') } this.checkNumberOfWorkers(this.numberOfWorkers) @@ -102,7 +97,7 @@ export abstract class AbstractPool< this.createAndSetupWorker() } - if (this.opts.enableEvents) { + if (this.opts.enableEvents === true) { this.emitter = new PoolEmitter() } this.workerChoiceStrategyContext = new WorkerChoiceStrategyContext( @@ -182,6 +177,9 @@ export abstract class AbstractPool< workerChoiceStrategy: WorkerChoiceStrategy ): void { this.opts.workerChoiceStrategy = workerChoiceStrategy + for (const worker of this.workers) { + this.resetWorkerTasksUsage(worker) + } this.workerChoiceStrategyContext.setWorkerChoiceStrategy( workerChoiceStrategy ) @@ -274,7 +272,7 @@ export abstract class AbstractPool< /** * Removes the given worker from the pool. * - * @param worker Worker that will be removed. + * @param worker The worker that will be removed. */ protected removeWorker (worker: Worker): void { // Clean worker from data structure @@ -307,8 +305,8 @@ export abstract class AbstractPool< /** * Registers a listener callback on a given worker. * - * @param worker A worker. - * @param listener A message listener callback. + * @param worker The worker which should register a listener. + * @param listener The message listener callback. */ protected abstract registerWorkerMessageListener< Message extends Data | Response @@ -355,12 +353,7 @@ export abstract class AbstractPool< this.workers.push(worker) // Init worker tasks usage map - this.workersTasksUsage.set(worker, { - run: 0, - running: 0, - runTime: 0, - avgRunTime: 0 - }) + this.initWorkerTasksUsage(worker) this.afterWorkerSetup(worker) @@ -387,7 +380,7 @@ export abstract class AbstractPool< } private checkAndEmitBusy (): void { - if (this.opts.enableEvents && this.busy) { + if (this.opts.enableEvents === true && this.busy === true) { this.emitter?.emit('busy') } } @@ -469,6 +462,20 @@ export abstract class AbstractPool< } } + /** + * Initializes tasks usage statistics. + * + * @param worker The worker. + */ + initWorkerTasksUsage (worker: Worker): void { + this.workersTasksUsage.set(worker, { + run: 0, + running: 0, + runTime: 0, + avgRunTime: 0 + }) + } + /** * Removes worker tasks usage statistics. * @@ -477,4 +484,14 @@ export abstract class AbstractPool< private removeWorkerTasksUsage (worker: Worker): void { this.workersTasksUsage.delete(worker) } + + /** + * Resets worker tasks usage statistics. + * + * @param worker The worker. + */ + private resetWorkerTasksUsage (worker: Worker): void { + this.removeWorkerTasksUsage(worker) + this.initWorkerTasksUsage(worker) + } }