From 75d3401a50550a9fc53e2e7d107bc2d776df83e3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Fri, 7 Jul 2023 00:14:47 +0200 Subject: [PATCH] feat: check worker inactive time only on dynamic worker MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- CHANGELOG.md | 1 + src/pools/abstract-pool.ts | 1 + src/utility-types.ts | 4 ++++ src/worker/abstract-worker.ts | 36 ++++++++++++++++++++++------------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df3eeb30..1863751c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add minimum and maximum to internal measurement statistics. - Add `runTime` and `waitTime` to pool information. +- Check worker inactive time only on dynamic worker. ## [2.6.8] - 2023-07-03 diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 730c0dd2..4b1a05ff 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -962,6 +962,7 @@ export abstract class AbstractPool< void (this.destroyWorker(worker) as Promise) } }) + this.sendToWorker(worker, { dynamic: true }) return worker } diff --git a/src/utility-types.ts b/src/utility-types.ts index 9ecf5657..980c0089 100644 --- a/src/utility-types.ts +++ b/src/utility-types.ts @@ -85,6 +85,10 @@ export interface MessageValue * Whether the worker has started or not. */ readonly started?: boolean + /** + * Whether the worker is dynamic or not. + */ + readonly dynamic?: boolean } /** diff --git a/src/worker/abstract-worker.ts b/src/worker/abstract-worker.ts index 7d81a88c..b8b442ec 100644 --- a/src/worker/abstract-worker.ts +++ b/src/worker/abstract-worker.ts @@ -55,7 +55,7 @@ export abstract class AbstractWorker< /** * Handler id of the `aliveInterval` worker alive check. */ - protected readonly aliveInterval?: NodeJS.Timeout + protected aliveInterval?: NodeJS.Timeout /** * Constructs a new poolifier worker. * @@ -88,12 +88,6 @@ export abstract class AbstractWorker< this.checkWorkerOptions(this.opts) this.checkTaskFunctions(taskFunctions) if (!this.isMain) { - this.lastTaskTimestamp = performance.now() - this.aliveInterval = setInterval( - this.checkAlive.bind(this), - (this.opts.maxInactiveTime ?? DEFAULT_MAX_INACTIVE_TIME) / 2 - ) - this.checkAlive.bind(this)() this.mainWorker?.on('message', this.messageListener.bind(this)) } } @@ -151,7 +145,13 @@ export abstract class AbstractWorker< * @param message - Message received. */ protected messageListener (message: MessageValue): void { - if (message.id != null && message.data != null) { + if (message.dynamic === true) { + // Worker dynamic message received + this.startCheckAlive() + } else if (message.statistics != null) { + // Statistics message received + this.statistics = message.statistics + } else if (message.id != null && message.data != null) { // Task message received const fn = this.getTaskFunction(message.name) if (isAsyncFunction(fn)) { @@ -159,9 +159,6 @@ export abstract class AbstractWorker< } else { this.runInAsyncScope(this.runSync.bind(this), this, fn, message) } - } else if (message.statistics != null) { - // Statistics message received - this.statistics = message.statistics } else if (message.kill != null) { // Kill message received this.aliveInterval != null && clearInterval(this.aliveInterval) @@ -169,6 +166,15 @@ export abstract class AbstractWorker< } } + private startCheckAlive (): void { + this.lastTaskTimestamp = performance.now() + this.aliveInterval = setInterval( + this.checkAlive.bind(this), + (this.opts.maxInactiveTime ?? DEFAULT_MAX_INACTIVE_TIME) / 2 + ) + this.checkAlive.bind(this)() + } + /** * Returns the main worker. * @@ -243,7 +249,9 @@ export abstract class AbstractWorker< id: message.id }) } finally { - !this.isMain && (this.lastTaskTimestamp = performance.now()) + if (!this.isMain && this.aliveInterval != null) { + this.lastTaskTimestamp = performance.now() + } } } @@ -281,7 +289,9 @@ export abstract class AbstractWorker< }) }) .finally(() => { - !this.isMain && (this.lastTaskTimestamp = performance.now()) + if (!this.isMain && this.aliveInterval != null) { + this.lastTaskTimestamp = performance.now() + } }) .catch(EMPTY_FUNCTION) } -- 2.34.1