X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fabstract-pool.ts;h=54447c82ba2db2e9a88503d6e670f73022a143bc;hb=008a75fe80f29ce358a78eb8df64c70ebe3e64d3;hp=0c4b59c92fef071bbddd487d1490ed5d2f8db38b;hpb=4a6952ffec2bc4dba2d73bd747c003d0fe59fe7c;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 0c4b59c9..54447c82 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -4,7 +4,7 @@ import type { } from '../utility-types' import { isKillBehavior, KillBehaviors } from '../worker/worker-options' import type { IPoolInternal } from './pool-internal' -import { PoolEmitter } from './pool-internal' +import { PoolEmitter, PoolType } from './pool-internal' import type { WorkerChoiceStrategy } from './selection-strategies' import { WorkerChoiceStrategies, @@ -87,6 +87,12 @@ export interface PoolOptions { * The work choice strategy to use in this pool. */ workerChoiceStrategy?: WorkerChoiceStrategy + /** + * Pool events emission. + * + * Default to true. + */ + enableEvents?: boolean } /** @@ -108,7 +114,10 @@ export abstract class AbstractPool< public readonly tasks: Map = new Map() /** @inheritdoc */ - public readonly emitter: PoolEmitter + public readonly emitter?: PoolEmitter + + /** @inheritdoc */ + public readonly max?: number /** * The promise map. @@ -156,13 +165,16 @@ export abstract class AbstractPool< } this.checkNumberOfWorkers(this.numberOfWorkers) this.checkFilePath(this.filePath) + this.checkPoolOptions(this.opts) this.setupHook() for (let i = 1; i <= this.numberOfWorkers; i++) { this.createAndSetupWorker() } - this.emitter = new PoolEmitter() + if (this.opts.enableEvents) { + this.emitter = new PoolEmitter() + } this.workerChoiceStrategyContext = new WorkerChoiceStrategyContext( this, () => { @@ -179,7 +191,7 @@ export abstract class AbstractPool< }) return workerCreated }, - opts.workerChoiceStrategy ?? WorkerChoiceStrategies.ROUND_ROBIN + this.opts.workerChoiceStrategy ) } @@ -202,14 +214,23 @@ export abstract class AbstractPool< throw new Error( 'Cannot instantiate a pool with a negative number of workers' ) - } else if (!this.dynamic && numberOfWorkers === 0) { + } else if (this.type === PoolType.FIXED && numberOfWorkers === 0) { throw new Error('Cannot instantiate a fixed pool with no worker') } } + private checkPoolOptions (opts: PoolOptions): void { + this.opts.workerChoiceStrategy = + opts.workerChoiceStrategy ?? WorkerChoiceStrategies.ROUND_ROBIN + this.opts.enableEvents = opts.enableEvents ?? true + } + /** @inheritdoc */ - public get dynamic (): boolean { - return false + public abstract get type (): PoolType + + /** @inheritdoc */ + public get numberOfRunningTasks (): number { + return this.promiseMap.size } /** @inheritdoc */ @@ -222,11 +243,33 @@ export abstract class AbstractPool< ) } + /** @inheritdoc */ + public abstract get busy (): boolean + + protected internalGetBusyStatus (): boolean { + return ( + this.numberOfRunningTasks >= this.numberOfWorkers && + this.findFreeTasksMapEntry() === false + ) + } + + /** @inheritdoc */ + public findFreeTasksMapEntry (): [Worker, number] | false { + for (const [worker, numberOfTasks] of this.tasks) { + if (numberOfTasks === 0) { + // A worker is free, return the matching tasks map entry + return [worker, numberOfTasks] + } + } + return false + } + /** @inheritdoc */ public execute (data: Data): Promise { // Configure worker to handle message with the specified task const worker = this.chooseWorker() this.increaseWorkersTask(worker) + this.checkAndEmitBusy() const messageId = ++this.nextMessageId const res = this.internalExecute(worker, messageId) this.sendToWorker(worker, { data: data || ({} as Data), id: messageId }) @@ -259,7 +302,7 @@ export abstract class AbstractPool< protected abstract isMain (): boolean /** - * Increase the number of tasks that the given workers has done. + * Increase the number of tasks that the given workers has applied. * * @param worker Worker whose tasks are increased. */ @@ -268,7 +311,7 @@ export abstract class AbstractPool< } /** - * Decrease the number of tasks that the given workers has done. + * Decrease the number of tasks that the given workers has applied. * * @param worker Worker whose tasks are decreased. */ @@ -277,7 +320,7 @@ export abstract class AbstractPool< } /** - * Step the number of tasks that the given workers has done. + * Step the number of tasks that the given workers has applied. * * @param worker Worker whose tasks are set. * @param step Worker number of tasks step. @@ -399,4 +442,10 @@ export abstract class AbstractPool< } } } + + private checkAndEmitBusy (): void { + if (this.opts.enableEvents && this.busy) { + this.emitter?.emit('busy') + } + } }