X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fabstract-pool.ts;h=b43d44a59eea1cb1c7990e660b96cb4cd5483a03;hb=10e2aa7eed41bc326d02cf6055242768465ecdc5;hp=10a5ce42af8d58e183761f454069d00f6b76a593;hpb=d2c73f82d13f6a30d46e829709ad21373271727a;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 10a5ce42..b43d44a5 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -128,7 +128,13 @@ export abstract class AbstractPool< this.setupHook() - while (this.workerNodes.length < this.numberOfWorkers) { + while ( + this.workerNodes.reduce( + (accumulator, workerNode) => + !workerNode.info.dynamic ? accumulator + 1 : accumulator, + 0 + ) < this.numberOfWorkers + ) { this.createAndSetupWorker() } @@ -172,9 +178,9 @@ export abstract class AbstractPool< throw new RangeError( 'Cannot instantiate a dynamic pool with a maximum pool size inferior to the minimum pool size' ) - } else if (min === 0 && max === 0) { + } else if (max === 0) { throw new RangeError( - 'Cannot instantiate a dynamic pool with a minimum pool size and a maximum pool size equal to zero' + 'Cannot instantiate a dynamic pool with a pool size equal to zero' ) } else if (min === max) { throw new RangeError( @@ -411,16 +417,24 @@ export abstract class AbstractPool< } private get starting (): boolean { - return this.workerNodes.length < this.minSize + return ( + this.workerNodes.reduce( + (accumulator, workerNode) => + !workerNode.info.dynamic ? accumulator + 1 : accumulator, + 0 + ) < this.minSize + ) } private get ready (): boolean { return ( - this.workerNodes.length >= this.minSize && - this.workerNodes.every( - (workerNode, workerNodeKey) => - workerNodeKey < this.minSize && workerNode.info.ready - ) + this.workerNodes.reduce( + (accumulator, workerNode) => + !workerNode.info.dynamic && workerNode.info.ready + ? accumulator + 1 + : accumulator, + 0 + ) >= this.minSize ) } @@ -949,7 +963,7 @@ export abstract class AbstractPool< this.removeWorkerNode(worker) }) - this.pushWorkerNode(worker) + this.addWorkerNode(worker) this.afterWorkerSetup(worker) @@ -979,10 +993,12 @@ export abstract class AbstractPool< } }) const workerInfo = this.getWorkerInfo(this.getWorkerNodeKey(worker)) - workerInfo.ready = true workerInfo.dynamic = true + if (this.workerChoiceStrategyContext.getStrategyPolicy().useDynamicWorker) { + workerInfo.ready = true + } this.sendToWorker(worker, { - checkAlive: true, + checkActive: true, workerId: workerInfo.id as number }) return worker @@ -1062,8 +1078,8 @@ export abstract class AbstractPool< return message => { this.checkMessageWorkerId(message) if (message.ready != null) { - // Worker ready message received - this.handleWorkerReadyMessage(message) + // Worker ready response received + this.handleWorkerReadyResponse(message) } else if (message.id != null) { // Task execution response received this.handleTaskExecutionResponse(message) @@ -1071,7 +1087,7 @@ export abstract class AbstractPool< } } - private handleWorkerReadyMessage (message: MessageValue): void { + private handleWorkerReadyResponse (message: MessageValue): void { const worker = this.getWorkerById(message.workerId) this.getWorkerInfo(this.getWorkerNodeKey(worker as Worker)).ready = message.ready as boolean @@ -1128,17 +1144,18 @@ export abstract class AbstractPool< } /** - * Pushes the given worker in the pool worker nodes. + * Adds the given worker in the pool worker nodes. * * @param worker - The worker. * @returns The worker nodes length. */ - private pushWorkerNode (worker: Worker): number { - const workerNode = new WorkerNode(worker, this.worker) + private addWorkerNode (worker: Worker): number { + const workerNode = new WorkerNode(worker, this.worker) + // Flag the worker node as ready at pool startup. if (this.starting) { workerNode.info.ready = true } - return this.workerNodes.push(new WorkerNode(worker, this.worker)) + return this.workerNodes.push(workerNode) } /** @@ -1154,6 +1171,12 @@ export abstract class AbstractPool< } } + /** + * Executes the given task on the given worker. + * + * @param worker - The worker. + * @param task - The task to execute. + */ private executeTask (workerNodeKey: number, task: Task): void { this.beforeTaskExecutionHook(workerNodeKey, task) this.sendToWorker(this.workerNodes[workerNodeKey].worker, task)