X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fabstract-pool.ts;h=283b04d682b4a656b6a430a78714a9ae52582e72;hb=f294681c4244effd6671e9d3534bf54bbf122d7a;hp=232b0cc17e702e95c12bb0b083e351af3f624161;hpb=b93080b79a5e2e5d174991d87e96c97b307df18e;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 232b0cc1..283b04d6 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -38,6 +38,7 @@ import { type WorkerChoiceStrategyOptions } from './selection-strategies/selection-strategies-types' import { WorkerChoiceStrategyContext } from './selection-strategies/worker-choice-strategy-context' +import { version } from './version' /** * Base class that implements some shared logic for all poolifier pools. @@ -249,6 +250,7 @@ export abstract class AbstractPool< /** @inheritDoc */ public get info (): PoolInfo { return { + version, type: this.type, worker: this.worker, minSize: this.minSize, @@ -298,22 +300,14 @@ export abstract class AbstractPool< } } - /** - * Gets the pool run time. - * - * @returns The pool run time in milliseconds. - */ - private get runTime (): number { - return performance.now() - this.startTimestamp - } - /** * Gets the approximate pool utilization. * * @returns The pool utilization. */ private get utilization (): number { - const poolRunTimeCapacity = this.runTime * this.maxSize + const poolRunTimeCapacity = + (performance.now() - this.startTimestamp) * this.maxSize const totalTasksRunTime = this.workerNodes.reduce( (accumulator, workerNode) => accumulator + workerNode.usage.runTime.aggregate, @@ -505,7 +499,13 @@ export abstract class AbstractPool< this.workerNodes.map(async (workerNode, workerNodeKey) => { this.flushTasksQueue(workerNodeKey) // FIXME: wait for tasks to be finished + const workerExitPromise = new Promise(resolve => { + workerNode.worker.on('exit', () => { + resolve() + }) + }) await this.destroyWorker(workerNode.worker) + await workerExitPromise }) ) } @@ -766,6 +766,33 @@ export abstract class AbstractPool< if (this.emitter != null) { this.emitter.emit(PoolEvents.error, error) } + if (this.opts.enableTasksQueue === true) { + const workerNodeKey = this.getWorkerNodeKey(worker) + while (this.tasksQueueSize(workerNodeKey) > 0) { + let targetWorkerNodeKey: number = workerNodeKey + let minQueuedTasks = Infinity + for (const [workerNodeId, workerNode] of this.workerNodes.entries()) { + if ( + workerNodeId !== workerNodeKey && + workerNode.usage.tasks.queued === 0 + ) { + targetWorkerNodeKey = workerNodeId + break + } + if ( + workerNodeId !== workerNodeKey && + workerNode.usage.tasks.queued < minQueuedTasks + ) { + minQueuedTasks = workerNode.usage.tasks.queued + targetWorkerNodeKey = workerNodeId + } + } + this.enqueueTask( + targetWorkerNodeKey, + this.dequeueTask(workerNodeKey) as Task + ) + } + } if (this.opts.restartWorkerOnError === true) { this.createAndSetupWorker() } @@ -987,13 +1014,11 @@ export abstract class AbstractPool< } private flushTasksQueue (workerNodeKey: number): void { - if (this.tasksQueueSize(workerNodeKey) > 0) { - for (let i = 0; i < this.tasksQueueSize(workerNodeKey); i++) { - this.executeTask( - workerNodeKey, - this.dequeueTask(workerNodeKey) as Task - ) - } + while (this.tasksQueueSize(workerNodeKey) > 0) { + this.executeTask( + workerNodeKey, + this.dequeueTask(workerNodeKey) as Task + ) } this.workerNodes[workerNodeKey].tasksQueue.clear() }