All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
4.2.11 (2024-09-12)
- track dynamic pool empty event lifecycle (7923fe5)
- add dynamic worker nodes count to pool info (01277ce)
- refine dynamic pool shutdown test expectations (fc43a51)
- publish documentation (4a809cf)
- deps-dev: bump sinon from 18.0.0 to 18.0.1 in the regular group (947d358)
- deps-dev: bump the regular group with 2 updates (efd5d49)
- deps: bump the regular group across 11 directories with 1 update (#2568) (678986c)
- deps: bump the regular group across 3 directories with 1 update (7e6cc27)
4.2.10 (2024-09-06)
- optimize backpressure task(s) stealing conditions (9df97af)
- add
isWorkerNodeStealing()
helper (febcf8e) - factor out stealing ratio conditions check into an helper (207df8a)
- cleanup error handling expectations (d960e54)
- add
mapExecute
implementation to fastify examples plugin (3924d83) - add missing
mapExecute
type definition to fastify examples (83572f4) - code cleanup in examples (24bc951)
- publish documentation (d3a3b16)
- switch to
mapExecute()
in examples (8162986)
- deps-dev: bump @types/node in the regular group (fb8923f)
- deps-dev: bump the regular group across 11 directories with 1 update (8ae78fb)
- deps-dev: bump the regular group across 11 directories with 1 update (4a2b738)
- deps-dev: bump the regular group with 2 updates (b1b652f)
- deps: bump nodemailer (552013f)
- deps: bump the regular group across 11 directories with 2 updates (302fa26)
- deps: bump the regular group across 11 directories with 2 updates (#2557) (eb97198)
4.2.9 (2024-08-30)
- handle properly small or zero
tasksStealingRatio
(e45f621)
- publish documentation (41a50df)
4.2.8 (2024-08-30)
- fix dynamic thread pool full event emission rate (52021de)
- move dynamic pool only getters to its own class (21e6b0e)
- refine pool event tests expectation (6a30766)
- publish documentation (bc407dc)
- README.md: fix worker example export (a5844a0)
- README.md: use top level await syntax in example (3b4d090)
- refine pool ready event emission condition (3abc7fe)
- deps-dev: bump the regular group with 3 updates (d707c4d)
- deps: bump the regular group across 11 directories with 2 updates (5c2e6e8)
4.2.7 (2024-08-28)
- reduce useless branching at pool info building (4a29667)
- track dynamic pool full lifecycle via events (5f9e905)
- improve pool empty event test (4b91b77)
- publish documentation (f948bb3)
- deps-dev: bump eslint-plugin-perfectionist from 3.2.0 to 3.3.0 in the regular group (#2549) (60b5fab)
- deps: bump the regular group across 11 directories with 1 update (#2550) (7cfe89c)
4.2.6 (2024-08-27)
- fix pool back pressure semantic on dynamic pool (227e9e9)
- track pool back pressure lifecycle via events (303c0db)
- track pool busy lifecycle via events (f8a57da)
- cleanup worker node back pressure checks (697d8c6)
- publish documentation (22cdcdd)
- deps-dev: bump the regular group with 2 updates (46c6476)
- deps: bump the regular group across 11 directories with 2 updates (43922bf)
4.2.5 (2024-08-26)
- ensure no deleted dynamic worker can be used to steal task(s) (60ff5f0)
- cleanup worker node back pressure detection implementation (6546b6a)
- cleanup worker node state conditions check (2a8bfdf)
- publish documentation (200c455)
4.2.4 (2024-08-24)
- fix pool ready status with zero min size dynamic pool (e48fa7a)
- switch to eslint-plugin-perfectionist (9723108)
- deps-dev: bump husky from 9.1.4 to 9.1.5 in the regular group (#2538) (d25e4f5)
- deps-dev: bump the regular group across 11 directories with 1 update (#2539) (dd24a54)
- deps-dev: bump the regular group with 2 updates (205d209)
- deps: bump sonarsource/sonarcloud-github-action (#2537) (82e0653)
- deps: bump the regular group across 11 directories with 3 updates (#2536) (b901726)
- deps: bump the regular group across 7 directories with 2 updates (e559d2d)
4.2.3 (2024-08-19)
- account for all stealing worker nodes (d967235)
- define a variable only when needed (4f28c7a)
- display back pressured worker nodes in pool info (8c7a518)
- publish documentation (e4db94f)
- deps-dev: apply updates (5a96b64)
- deps-dev: bump @types/node in the regular group (#2533) (b2cd95b)
- deps-dev: bump eslint-plugin-jsdoc in the regular group (d20645f)
- deps-dev: bump the regular group across 11 directories with 1 update (#2534) (a9c233d)
- deps: bump the regular group across 11 directories with 2 updates (c657b5d)
4.2.2 (2024-08-14)
- fix race condition at task response handling during pool destroy (b28533a)
- workaround race conditions at pool destroy (684f132)
- publish documentation (df66bb1)
4.2.1 (2024-08-14)
- ensure task stealing can't start twice on the same worker node (37cc14e)
- trigger continuous tasks stealing under proper conditions (2663563)
- remove unneeded condition at task response handling (93df097)
- deps-dev: bump eslint-plugin-jsdoc in the regular group (#2525) (b9873cb)
- deps: bump the regular group across 11 directories with 2 updates (#2526) (d3167a7)
4.2.0 (2024-08-13)
- reenable tasks stealing under back pressure by default (f09b195)
- protect worker node tasks queue from concurrent tasks stealing (eebfd81)
- do mapExecute() args sanity checks once (390300c)
- cleanup fixed pool tests setup and teardown (311c5bd)
- cleanup resources setup and teardown (e1e0cb2)
- remove duplicate tests (55a9fbc)
- add documentation on enablePrority priority queue getter/setter (3e53cc1)
- api: add missing tasksStealingRatio default value (5b65da9)
- publish documentation (e57792c)
- ci: reenabled code auto formatting and linting (31e5cb9)
- ci: silence linter on examples (6a2f448)
- deps-dev: bump @commitlint/cli in the regular group (#2518) (798d464)
- deps-dev: bump @cspell/eslint-plugin from 8.11.0 to 8.12.1 (cb4a4fd)
- deps-dev: bump @cspell/eslint-plugin from 8.12.1 to 8.13.0 (#2490) (d94680b)
- deps-dev: bump @cspell/eslint-plugin from 8.13.0 to 8.13.1 (f4b46c2)
- deps-dev: bump @types/node (898fb96)
- deps-dev: bump @types/node (b83105c)
- deps-dev: bump @types/node (30ccf3b)
- deps-dev: bump @types/node (72e99f3)
- deps-dev: bump @types/node (6032c66)
- deps-dev: bump @types/node (90a355a)
- deps-dev: bump @types/node (dc72c1f)
- deps-dev: bump @types/node (9072888)
- deps-dev: bump @types/node (4001e8f)
- deps-dev: bump @types/node (4b3f7ff)
- deps-dev: bump @types/node (bffa27b)
- deps-dev: bump @types/node (51b8676)
- deps-dev: bump @types/node (84e2af2)
- deps-dev: bump @types/node from 20.14.11 to 20.14.12 (#2484) (b04790a)
- deps-dev: bump @types/node from 22.0.2 to 22.1.0 (e2c63d9)
- deps-dev: bump eslint-plugin-jsdoc from 48.10.2 to 48.11.0 (a335dbb)
- deps-dev: bump eslint-plugin-jsdoc from 48.9.2 to 48.10.2 (#2489) (7740dd2)
- deps-dev: bump eslint-plugin-jsdoc in the major group (#2519) (97be5ef)
- deps-dev: bump husky from 9.1.2 to 9.1.3 (#2487) (788cee8)
- deps-dev: bump rollup (cc75e8e)
- deps-dev: bump rollup (b802739)
- deps-dev: bump rollup (1d82f1e)
- deps-dev: bump rollup (18ccae8)
- deps-dev: bump rollup (e45d209)
- deps-dev: bump rollup (865b4f5)
- deps-dev: bump rollup from 4.19.1 to 4.19.2 (caf6fe3)
- deps-dev: bump the regular group with 2 updates (#2523) (cc9a0fb)
- deps-dev: bump typedoc from 0.26.4 to 0.26.5 (27433e0)
- deps-dev: update eslint-plugin-jsdoc to 50.2.0 (25bf98e)
- deps: bump axios in /examples/typescript/http-client-pool (#2501) (9c8c7b6)
- deps: bump github/combine-prs from 5.0.0 to 5.1.0 (#2476) (9c14720)
4.1.0 (2024-07-18)
- add ratio of worker nodes in a pool allowed to perform concurrent tasks stealing (e25f86b), closes #2284
- npx -> pnpm dlx where appropriates (21b76dc)
- fix error type expectation (16196bc)
- api.md: add missing ToC entry (989a71a)
- api.md: document tasksStealingRatio tasks queue option (453c646)
- publish documentation (082fb4d)
- deps-dev: bump @cspell/eslint-plugin from 8.10.4 to 8.11.0 (ae8cecf)
- deps-dev: bump @types/node (e1436e8)
- deps-dev: bump husky from 9.0.11 to 9.1.0 (#2474) (8b770d2)
- deps-dev: bump prettier from 3.3.2 to 3.3.3 (#2469) (ed09ef1)
- deps-dev: bump tatami-ng from 0.5.1 to 0.5.3 (27ddec8)
- deps: bump poolifier (01afcb2)
- deps: bump poolifier (f49f67f)
- deps: bump poolifier (ac181f4)
- deps: bump poolifier (966953d)
- deps: bump poolifier (d67aa39)
- deps: bump poolifier (4763e8c)
- deps: bump poolifier (69b9ebc)
- deps: bump poolifier (37645d7)
- deps: bump poolifier (c63416f)
- deps: bump poolifier in /examples/typescript/http-client-pool (d96a9d3)
- deps: bump poolifier in /examples/typescript/smtp-client-pool (af1cc0e)
4.0.18 (2024-07-11)
- null exception when a task errored (ac5ee55)
- priority-queue: cleanup intermediate variables namespace (bb5d86b)
- improve WorkerNode init coverage (bcac180)
- fix CHANGELOG.md formatting (1823a63)
- flag WorkerChoiceStrategiesContext class as internal (9eacd2e)
- publish documentation (62d0f6f)
4.0.17 (2024-07-07)
- optimize tasks queuing implementation (097dea6)
- factor out fixed queue common code in an abstract class (840270a)
- format code (9183b88)
- move queueing code into its own directory (c6dd1ae)
- refine queue full error message (9008a96)
- remove duplicate code in fixed-queue.ts (7a1c77f)
- generate documentation (a7ee49b)
- ci: fix automated documentation publication at releasing (147c01e)
- deps-dev: bump @cspell/eslint-plugin from 8.10.1 to 8.10.2 (4f10a83)
- deps-dev: bump @types/node (1d24d0e)
- deps-dev: bump @types/node (ffa4f4f)
- deps-dev: bump @types/node (1fe2514)
- deps-dev: bump @types/node (e90a256)
- deps-dev: bump @types/node (0bf1a17)
- deps-dev: bump @types/node (dd73d0c)
- deps-dev: bump @types/node (2be2259)
- deps-dev: bump @types/node (828a2e0)
- deps-dev: bump @types/node (7109e5b)
- deps-dev: bump @types/node (6f81d57)
- deps-dev: bump @types/node (dc6b47a)
- deps-dev: bump @types/node from 20.14.9 to 20.14.10 (4c07331)
- deps: bump poolifier (9b11cba)
- deps: bump poolifier (4c39d13)
- deps: bump poolifier (b0ad3bc)
- deps: bump poolifier (aa6ea2c)
- deps: bump poolifier (ec4d611)
- deps: bump poolifier (cc4e9f0)
- deps: bump poolifier (6e1b4de)
- deps: bump poolifier (8e21198)
- deps: bump poolifier in /examples/typescript/http-client-pool (7961830)
- deps: bump poolifier in /examples/typescript/smtp-client-pool (475dc40)
4.0.16 (2024-07-05)
- generate documentation (224d008)
- generate documentation (627fc57)
- refine PR template (f5e9127)
- refine PR template (e95501c)
- refine README.md badges (7169bda)
- ci: cleanup GH actions (c5db2d3)
- code reformatting (fe6df28)
- refine biome.js configuration (1352ca7)
- silence linter (a17b6fe)
- ci: add autofix GH action (14b39b9)
- ci: do not cancel workflow in case of autofix failure (177dbab)
- ci: fix autofix GH action (e3a9678)
- ci: fix autofix GH action (0b7cbf7)
- ci: fix eslint configuration (c5d7f73)
- ci: publish documentation at release (3a83d94)
- ci: refine autofix GH action (8b7aa42)
- ci: refine autofix GH action (8ab143b)
- ci: switch to release-please release manager (4c7e68a)
- deps-dev: apply updates (5c48a85)
- deps-dev: apply updates (f94bb23)
- deps-dev: apply updates (1e98512)
- deps-dev: apply updates (aaceda9)
- deps-dev: apply updates (3dcc95e)
- deps-dev: apply updates (0aa0016)
- deps-dev: apply updates (dea4237)
- deps-dev: apply updates (e06ce0e)
- deps-dev: apply updates (80605a6)
- deps-dev: apply updates (3b594fe)
- deps-dev: apply updates (df01d9a)
- deps-dev: apply updates (a1b4a65)
- deps-dev: apply updates (31a42de)
- deps-dev: bump @cspell/eslint-plugin from 8.9.0 to 8.9.1 (0b4d6a4)
- deps-dev: bump eslint-plugin-jsdoc from 48.2.13 to 48.4.0 (195a874)
- deps-dev: bump mocha from 10.4.0 to 10.5.0 (b1b2093)
- deps-dev: bump mocha from 10.5.1 to 10.5.2 (a4d1195)
- deps-dev: bump neostandard from 0.7.2 to 0.8.0 (7344812)
- deps-dev: bump typedoc from 0.26.0 to 0.26.2 (8004ea7)
- deps-dev: bump typescript (fca1e52)
- deps-dev: bump typescript (345d416)
- deps-dev: bump typescript (3aa8d66)
- deps-dev: bump typescript (8837306)
- deps-dev: bump typescript (0b79799)
- deps-dev: bump typescript (995d429)
- deps-dev: bump typescript (2905914)
- deps-dev: bump typescript (f2c2f1b)
- deps-dev: bump typescript (37b0774)
- deps-dev: bump typescript (f4a2509)
- deps-dev: bump typescript (97bb99a)
- deps: bump poolifier (5d5410e)
- deps: bump poolifier (177e46b)
- deps: bump poolifier (580433b)
- deps: bump poolifier (a0583d4)
- deps: bump poolifier (161136f)
- deps: bump poolifier (70075ce)
- deps: bump poolifier (d74c068)
- deps: bump poolifier (b8e4e7d)
- deps: bump poolifier (239d223)
- deps: bump poolifier in /examples/typescript/http-client-pool (1e6c12d)
- deps: bump poolifier in /examples/typescript/smtp-client-pool (4c29535)
- deps: bump ws (5ae7d26)
- deps: bump ws (5fea98e)
- deps: bump ws (cf6f83d)
- Fix priority queue dequeue() from the last prioritized bucket.
- Add mapExecute() helper to execute a task function on an iterable data's input.
- Optimize tasks queue implementation.
- Enable prioritized tasks queueing only when necessary.
- Optimize circular buffer implementation to store task execution measurements.
- Switch to optimized circular buffer implementation to store task execution measurements.
- Ensure tasks stealing dynamic worker node is not destroyed on inactivity.
- Add ELU
utilization
statistics to pool information.
- Fix default task function worker choice strategy and priority handling.
- Add ELU statistics to pool information.
- Fix pools'
addTaskFunction()
type definition.
- Avoid queued tasks redistribution on the errored worker node.
- Disable
tasksStealingOnBackPressure
by default until performance issues under heavy load are sorted out.
- Optimize task(s) stealing by dequeuing task(s) from the last prioritized bucket.
- Ensure poolifier worker task performance measurement requirements are synchronized with task function objects' worker choice strategies.
- Ensure dynamic worker node are initialized with sensible worker node usage default values to avoid worker choice strategies biased decisions.
- Account for tasks wait time in task execution time computation in worker choice strategies to avoid biased decisions under load with several prioritized task functions and tasks queue enabled.
- Support per task function(s) priority and worker choice strategy definition via a task function object:
{ taskFunction: (data?: Data) => Response | Promise<Response>, priority?: number, strategy?: WorkerChoiceStrategy }
. - Add priority queue based tasks queueing. One priority queue is divided into prioritized buckets to avoid queued tasks starvation under load.
- BREAKING CHANGE:
listTaskFunctionNames()
tolistTaskFunctionsProperties()
in pool and worker API returning registered task functions properties. - BREAKING CHANGE:
strategy
field in pool information renamed todefaultStrategy
.
- Ensure worker choice strategy options changes at runtime are propagated to poolifier workers.
- Fix
transferList
argument type definition.
- Fix possible race condition at worker node recreation on worker
error
andexit
events.
- Ensure the minimum number of workers on a started pool is guaranteed.
- Fix publishing on JSR, take 4.
- Fix publishing on JSR, take 3.
- Fix publishing on JSR, take 2.
- Fix publishing on JSR.
- Publish on JSR.
- Fix pool event emitter registered callbacks removal at
destroy()
.
- Fix null exception regression: #1496.
- Ensure
worker_threads
workers are unreferenced at termination.
- Fix possible null exception at task finishing handling.
- Optimize Deque implementation to improve tasks queueing performance.
- Fix dynamic pool with minimum number of workers set to zero: #1748.
- Improve performance by clean up unneeded condition checks on hot code paths.
- Add missing type to TS type definitions.
- Fix CommonJS support with TypeScript: #1821.
- Fix CommonJS support with TypeScript: #1821.
- Properly handle dynamic pool with zero minimum size.
- Reduce branching in several hot code paths.
- Use faster object cloning implementation.
- Fix tasks redistribution triggers at pool destroying.
- Switch TypeScript module resolution to Node16.
- Fix tasks redistribution triggers at pool destroying.
- Avoid worker node cross tasks stealing.
- Ensure only half the pool worker nodes can steal tasks.
- Avoid useless branching on pool type.
- Readd ThreadPoolOptions and ClusterPoolOptions TS type aliases to PoolOptions.
- Fix default worker weight computation.
- Fix possible null exception at pool destroying.
- Ensure worker choice strategies implementation wait for worker node readiness: #1748.
- Fix pool destroying with tasks queuing enabled.
- Add queued tasks end timeout support to worker node termination.
- Make more robust the fix for possible null exception at handling task execution response.
- Fix possible null exception at handling task execution response.
- Wait for queued tasks to end at worker node termination.
- Fix pool options TS type definition.
- TypeScript breaking change: merge ThreadPoolOptions and ClusterPoolOptions types into PoolOptions type.
- Fix possible null exception with worker_threads pools.
- Ensure worker choice strategy wait for worker nodes readiness.
- Remove infinite retries support in worker choice strategy to avoid configuration leading to possible infinite recursion or loop.
- Add infinite retries support in worker choice strategy.
- Ensure pool asynchronous resource properly track tasks execution.
- Add a fastpath when tasks stealing or redistribution is impossible.
- Remove all pool events listener at pool destroying.
- Remove all worker node events listener at worker node destroying.
- Fix worker node event emitter listeners handling memory leak at pool options runtime change.
- Ensure continuous tasks stealing on idle start at worker node idling.
- Make continuous tasks stealing start at worker node idling.
- Ensure pool statuses are checked at initialization,
start()
ordestroy()
. - Ensure pool
ready
event can be emitted after severalstart()/destroy()
cycles.
- Ensure pool
ready
event can be emitted only once.
- Switch to Bencher for benchmarking: https://bencher.dev/perf/poolifier.
- Use builtin retry mechanism in worker choice strategies instead of custom one.
- Avoid null exception at sending message to worker.
- Avoid null exception at checking worker node readiness.
- Fix race condition at dynamic worker node task assignment and scheduled removal. See issue #1468 and #1496.
- Workaround possible race condition at work nodes array element removal and querying. See issue #1468.
- Switch the worker node eventing code to
EventTarget
API.
- Remove Node.js 16.x.x (EOL) support.
- Use
EventEmitterAsyncResource
type from@types/node
for pool event emitter. TypeScript users will need to update to latest@types/node
version.
- Fix source maps (bundler issue).
- Convert pool event emitter to event emitter async resource.
- Add source maps to npm package to ease debugging.
- Continuous benchmarking versus other worker pools: https://poolifier.github.io/benchmark.
- Ensure worker message listener used one time are removed after usage.
- Fix task stealing related tasks queue options handling at runtime.
- Rename
listTaskFunctions()
tolistTaskFunctionNames()
in pool and worker API.
- Add
hasTaskFunction()
,addTaskFunction()
,removeTaskFunction()
,setDefaultTaskFunction()
methods to pool API: PR #1148. - Stricter worker constructor arguments validation.
- Disable publication on GitHub packages registry on release until authentication issue is fixed.
- Add
startWorkers
to pool options to whether start the minimum number of workers at pool initialization or not. - Add
start()
method to pool API to start the minimum number of workers. - Add
taskStealing
andtasksStealingOnBackPressure
to tasks queue options to whether enable task stealing or not and whether enable tasks stealing under back pressure or not. - Continuous internal benchmarking: https://poolifier.github.io/benchmark-results/dev/bench.
- Use a dedicated PAT to publish on GitHub packages registry.
- Publish on GitHub packages registry on release.
- Switch from rome to biome: PR #1128.
- Publish on GitHub packages registry on release.
- Switch from rome to biome: PR #1128.
- Optimize hot code paths implementation: avoid unnecessary branching, add and use optimized helpers (min, max), use reduce() array helper, ...
- Optimize worker choice strategies implementation.
- Do not pre-choose in WRR worker choice strategy to avoid bias.
- Avoid array out of bound in worker choice strategies after worker node removal.
- Fix race condition in worker choice strategies at worker node info querying while not yet initialized.
- Bundle typescript types declaration into one file.
- Improve interleaved weighted round robin worker choice strategy implementation.
- Ensure unused worker usage statistics are deleted at runtime.
- Rename worker choice strategy options
choiceRetries
toretries
. - Avoid unnecessary branching in worker choice strategies.
- Fix pool
execute()
arguments check.
- Make continuous tasks stealing algorithm less aggressive.
- Fine tune tasks stealing algorithm under back pressure.
- Don't account worker usage statistics for tasks that have failed.
- Fix pool information runtime and wait time median computation.
- Update simple moving average implementation to use a circular buffer.
- Update simple moving median implementation to use a circular buffer.
- Account for stolen tasks in worker usage statistics and pool information.
- Continuous tasks stealing algorithm.
- Avoid cascading tasks stealing under back pressure.
- Add fastpath to queued tasks rescheduling.
- Fix queued tasks rescheduling.
- Rename tasks queue options
queueMaxSize
tosize
.
- Task stealing scheduling algorithm if tasks queueing is enabled.
- Ensure no task can be executed when the pool is destroyed.
- Add
queueMaxSize
option to tasks queue options. - Add O(1) deque implementation implemented with doubly linked list and use it for tasks queueing.
- Add tasks stealing algorithm when a worker node queue is back pressured if tasks queueing is enabled.
- Fix worker choice strategy retries mechanism in some edge cases.
- Make orthogonal worker choice strategies tasks distribution and created dynamic worker usage.
- Remove the experimental status of the
LEAST_ELU
worker choice strategy.
- Ensure pool event
backPressure
is emitted. - Ensure pool event
full
is emitted only once. - Ensure worker node cannot be instantiated without proper arguments.
- Fix race condition between readiness and task functions worker message handling at startup.
- Fix duplicate task function worker usage statistics computation per task function.
- Update task function worker usage statistics if and only if there's at least two different task functions.
- Fix race condition at task function worker usage executing task computation leading to negative value.
- Add back pressure detection on the worker node queue. Event
backPressure
is emitted when all worker node queues are full (worker node queue size >= poolMaxSize^2). - Use back pressure detection in worker choice strategies.
- Add worker choice strategies retries mechanism if no worker is eligible.
- Ensure pool workers are properly initialized.
- HTTP server pool examples: express-cluster, express-hybrid.
- Remove now useless branching in worker hot code path.
- Add
KillHandler
type definition to exported types.
- Add
destroy
event to pool API.
- Add kill handler to worker options allowing to execute custom code when worker is killed.
- Add
listTaskFunctions()
method to pool API. - SMTP client pool example: nodemailer.
- HTTP server pool examples: fastify-cluster, fastify-hybrid.
- WebSocket server pool examples: ws-cluster, ws-hybrid.
- Add array of transferable objects to the
execute()
method arguments. - WebSocket server pool examples: ws-worker_threads.
- Fix pool busyness semantic when tasks queueing is enabled: the pool is busy when the number of executing tasks on each worker has reached the maximum tasks concurrency per worker.
- HTTP client pool examples: fetch, node-fetch and axios with multiple task functions.
- HTTP server pool examples: express-worker_threads, fastify-worker_threads.
- Add missing
types
field to package.jsonexports
.
- Structure markdown documentation (PR #811).
- Improve code documentation.
- Code refactoring and cleanup for better maintainability and readability.
- Fix queued tasks redistribution on error task execution starvation.
- Ensure tasks queueing per worker condition is untangled from the pool busyness semantic.
- Drastically reduce lookups by worker in the worker nodes.
- Dedicated internal communication channel for worker_threads pools.
- Code refactoring and cleanup for better maintainability and readability. Bundle size is a bit smaller.
- Add
listTaskFunctions()
method to worker API.
- Fix pool startup detection.
- Fix worker task functions handling.
- Take into account worker node readiness in worker choice strategies.
- Fix task function statistics tracking.
- Add per task function statistics tracking.
- Add public methods to manipulate the worker task functions at runtime.
- Workaround import issue with
node:os
module in node 16.x.x.
- Fix pool readiness semantic.
- Ensure workers are not recreated on error at pool startup.
- Add
ready
andstrategy
fields to pool information. - Add pool event
ready
to notify when the number of workers created in the pool has reached the maximum size expected and are ready. - Add dynamic pool sizing checks.
- Recreate the right worker type on uncaught exception.
- Add minimum and maximum to internal measurement statistics.
- Add
runTime
andwaitTime
to pool information. - Check worker inactive time only on dynamic worker.
- Brown paper bag release to fix version handling in pool information.
- Ensure worker queued tasks at error are reassigned to other pool workers.
- Add pool
utilization
ratio to pool information. - Add
version
to pool information. - Add worker information to worker nodes.
- Add safe helper
availableParallelism()
to help sizing the pool.
- Ensure message handler is only registered in worker.
- Cluster pools tasks execution are not working by using ESM files extension: #782
- Artificial version bump to 2.6.5 to workaround publication issue.
- Ensure cluster pool
destroy()
gracefully shutdowns worker's server. - Ensure pool event is emitted before task error promise rejection.
- Fix queued tasks count computation.
- Remove unneeded worker_threads worker
MessageChannel
internal usage for IPC.
- Cluster pools tasks execution are not working by using ESM files extension: #782
- Ensure cluster pool
destroy()
gracefully shutdowns worker's server. - Ensure pool event is emitted before task error promise rejection.
- Fix queued tasks count computation.
- Remove unneeded worker_threads worker
MessageChannel
internal usage for IPC.
- Ensure no tasks are queued when trying to soft kill a dynamic worker.
- Update strategies internals after statistics computation.
- Optimize O(1) queue implementation.
- Fix new worker use after creation in dynamic pool given the current worker choice strategy.
- Add worker choice strategy documentation: README.md.
- Fix average statistics computation: ensure failed tasks are not accounted.
- Add
LEAST_ELU
worker choice strategy (experimental). - Add tasks ELU instead of runtime support to
FAIR_SHARE
worker choice strategy.
- Refactor pool worker node usage internals.
- Breaking change: refactor worker choice strategy statistics requirements: the syntax of the worker choice strategy options has changed.
- Breaking change: pool information
info
property object fields have been renamed.
- Fix wait time accounting.
- Ensure worker choice strategy
LEAST_BUSY
accounts also tasks wait time. - Ensure worker choice strategy
LEAST_USED
accounts also queued tasks.
- Add Event Loop Utilization (ELU) statistics to worker tasks usage.
- Compute statistics at the worker level only if needed.
- Add
worker_threads
options to thread pool options.
- Make the
LEAST_BUSY
strategy only relies on task runtime.
- Refine pool information content.
- Limit pool internals public exposure.
- Add
taskError
pool event for task execution error. - Add pool information
info
property to pool. - Emit pool information on
busy
andfull
pool events.
- Add pool option
restartWorkerOnError
to restart worker on uncaught error. Default totrue
. - Add
error
pool event for uncaught worker error.
- Switch pool event emitter to
EventEmitterAsyncResource
. - Add tasks wait time accounting in per worker tasks usage.
- Add interleaved weighted round robin
INTERLEAVED_WEIGHTED_ROUND_ROBIN
worker choice strategy (experimental).
- Renamed worker choice strategy
LESS_BUSY
toLEAST_BUSY
andLESS_USED
toLEAST_USED
.
- Ensure no undefined task runtime can land in the tasks history.
- Fix median computation implementation once again.
- Unit tests for median and queue implementations.
- Fix worker choice strategy options validation.
- Fix fair share worker choice strategy internals update: ensure virtual task end timestamp is computed at task submission.
- Support multiple task functions per worker.
- Add custom worker weights support to worker choice strategies options.
- Use O(1) queue implementation for tasks queueing.
- Fix median computation implementation.
- Fix fair share worker choice strategy internals update.
- Optimize free worker finding in worker choice strategies.
- Fix typescript type definition for task function: ensure the input data is optional.
- Fix typescript type definition for pool execute(): ensure the input data is optional.
- Add tasks queue enablement runtime setter to pool.
- Add tasks queue options runtime setter to pool.
- Add worker choice strategy options runtime setter to pool.
- Remove the tasks queuing experimental status.
- Fix task function type definition and validation.
- Fix worker choice strategy options handling.
- Fix message between main worker and worker type definition for tasks.
- Fix code documentation.
- Add worker tasks queue options to pool options.
- Fix missing documentation.
- Ensure one task at a time is executed per worker with tasks queueing enabled.
- Properly count worker executing tasks with tasks queueing enabled.
- Use monotonic high resolution timer for worker tasks runtime.
- Add worker tasks median runtime to statistics.
- Add worker tasks queue (experimental).
- Add
PoolEvents
enumeration andPoolEvent
type.
- Destroy worker only on alive check.
- Fix typedoc generation with inheritance.
- Add
full
event to dynamic pool. - Keep worker choice strategy in memory for conditional reuse.
- Fix possible negative worker key at worker removal in worker choice strategies.
- Optimize worker choice strategy for dynamic pool.
- Ensure dynamic pool does not alter worker choice strategy expected behavior.
- Add
LESS_BUSY
worker choice strategy.
- Optimize worker storage in pool.
- Optimize worker alive status check.
- BREAKING CHANGE: Rename worker choice strategy
LESS_RECENTLY_USED
toLESS_USED
. - Optimize
LESS_USED
worker choice strategy. - Update benchmark versus external threads pools.
- Optimize tasks usage statistics requirements for worker choice strategy.
- Ensure trimmable characters are checked at pool initialization.
- Fix message id integer overflow.
- Fix pool worker removal in worker choice strategy internals.
- Fix package publication with pnpm.
- Add
LESS_BUSY
worker choice strategy.
- Optimize worker storage in pool.
- Optimize worker alive status check.
- BREAKING CHANGE: Rename worker choice strategy
LESS_RECENTLY_USED
toLESS_USED
. - Optimize
LESS_USED
worker choice strategy. - Update benchmark versus external threads pools.
- Ensure trimmable characters are checked at pool initialization.
- Fix message id integer overflow.
- Fix pool worker removal in worker choice strategy internals.
- Fix package publication with pnpm.
- Add
LESS_BUSY
worker choice strategy.
- Optimize worker storage in pool.
- Optimize worker alive status check.
- BREAKING CHANGE: Rename worker choice strategy
LESS_RECENTLY_USED
toLESS_USED
. - Optimize
LESS_USED
worker choice strategy.
- Ensure trimmable characters are checked at pool initialization.
- Fix message id integer overflow.
- Fix pool worker removal in worker choice strategy internals.
- Fix package publication with pnpm.
- Add
LESS_BUSY
worker choice strategy.
- Optimize worker storage in pool.
- Optimize worker alive status check.
- BREAKING CHANGE: Rename worker choice strategy
LESS_RECENTLY_USED
toLESS_USED
. - Optimize
LESS_USED
worker choice strategy.
- Ensure trimmable characters are checked at pool initialization.
- Fix message id integer overflow.
- Fix pool worker removal in worker choice strategy internals.
- Add
LESS_BUSY
worker choice strategy.
- Optimize worker storage in pool.
- Optimize worker alive status check.
- BREAKING CHANGE: Rename worker choice strategy
LESS_RECENTLY_USED
toLESS_USED
. - Optimize
LESS_USED
worker choice strategy.
- Ensure trimmable characters are checked at pool initialization.
- Fix message id integer overflow.
- Fix pool worker removal in worker choice strategy internals.
- Fix package.json
exports
syntax for ESM and CommonJS.
- Permit SemVer pre-release publication.
- Fix package.json
exports
syntax for ESM and CommonJS.
- Permit SemVer pre-release publication.
- Fix package.json
exports
syntax for ESM and CommonJS.
- Introduce ESM module support along with CommonJS one.
- Fix brown paper bag bug referencing the same object literal.
- Switch internal benchmarking code to benny.
- Switch to TypeScript 5.x.x.
- Switch rollup bundler plugins to core ones.
- Switch to TSDoc syntax.
- Enforce conventional commits.
- Fix random integer generator.
- Fix worker choice strategy pool type identification at initialization.
- Switch to open collective FOSS project funding platform.
- Switch to ts-standard linter configuration on TypeScript code.
- Fixed missing async on pool execute method.
- Fixed typing in TypeScript example.
- Fixed types in unit tests.
- Cleanup pool attributes and methods.
- Refine error types thrown.
- Fix continuous integration build on windows.
- Fix code coverage reporting by using c8 instead of nyc.
- Improve benchmarks: add IO intensive task workload, add task size option, integrate code into linter.
- Optimize tasks usage lookup implementation.
- Fix missed pool event emitter type export.
- Fix typedoc documentation generation.
- Fully automate release process with release-it.
- Optimize fair share task scheduling algorithm implementation.
- Update benchmark versus external pools results with latest version.
- Add support for cluster settings in cluster pool options.
- Optimize fair share worker selection strategy implementation.
- Fix WRR worker selection strategy: ensure the condition triggering the round robin can be fulfilled.
- Pool worker choice strategies:
WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
strategy based on weighted round robin scheduling algorithm using tasks execution time for now.WorkerChoiceStrategies.FAIR_SHARE
strategy based on fair share scheduling algorithm using tasks execution time for now.
- Fixed
README.md
file.
- Dynamic worker choice strategy change at runtime.
- Support only Node.js version 16.x.x for cluster pool: upstream cluster API have changed on that version.
- Add an optional pool option
messageHandler
toPoolOptions<Worker>
for registering a message handler callback on each worker.
AbstractWorker
classmaxInactiveTime
,killBehavior
andasync
attributes have been removed in favour of the same ones in the worker optionsopts
public attribute.AbstractWorker
classlastTask
attribute have been renamed tolastTaskTimestamp
.AbstractWorker
classinterval
attribute have been renamed toaliveInterval
.AbstractWorker
class cannot be instantiated without specifying themainWorker
argument referencing the main worker.
- Fix
busy
event emission on fixed pool type
- Check if pool options are properly set.
busy
event is emitted on all pool types.
- Now a thread/process by default is not deleted when the task submitted take more time than maxInactiveTime configured (issue #70).
-
FullPool
event is now renamed tobusy
. -
maxInactiveTime
onThreadWorker
default behavior is now changed, if you want to keep the old behavior setkillBehavior
toKillBehaviors.HARD
. Find more details on our JSDoc. -
maxTasks
option onFixedThreadPool
andDynamicThreadPool
is now removed since is no more needed. -
We changed some internal structures, but you shouldn't be too affected by them as these are internal changes.
FixedThreadPoolOptions
and DynamicThreadPoolOptions
type declarations have been merged to PoolOptions<Worker>
.
// Before
const DynamicThreadPool = require('poolifier/lib/dynamic')
// After
const { DynamicThreadPool } = require('poolifier/lib/dynamic')
But you should always prefer just using
const { DynamicThreadPool } = require('poolifier')
For cluster worker and worker-thread pools, you can now only send and receive structured-cloneable data.
This is not a limitation by poolifier but Node.js.
numWorkers
property is now numberOfWorkers
These properties are not intended for end users
id
=>nextMessageId
These methods are not intended for end users
_chooseWorker
=>chooseWorker
_newWorker
=>createWorker
_execute
=>internalExecute
_chooseWorker
=>chooseWorker
_checkAlive
=>checkAlive
_run
=>run
_runAsync
=>runAsync
- ThreadWorker support async functions as option
- Various external library patches
- FixedThreadPool implementation
- DynamicThreadPool implementation
- WorkerThread implementation to improve developer experience