@ohfc/tiny-pool
Version:
Tiny WorkerPool implementation with support for backpressure and streams
143 lines (97 loc) • 3.56 kB
Markdown
# `@ohfc/tiny-pool`
A minimalist and efficient TypeScript worker thread pool library for Node.js, providing task queuing, concurrency control, and stream integration with backpressure support.
## Installation
```sh
npm install @ohfc/tiny-pool
```
## Quick Initialization Example
```ts
import { WorkerPool } from "@ohfc/tiny-pool";
const pool = new WorkerPool<number>("./worker.mjs", {
threads: 4,
maxQueueSize: 10,
});
pool.startThreads();
```
## Usage Examples
**Stream integration example:**
```ts
const source = Readable.from(Array.from({ length: 100 }, (_, i) => i));
const pool = WorkerPool.fromStream<number, number>(source, "./worker.mjs", { threads: 2 });
pool.on("data", (res) => console.log("result:", res));
pool.on("end", async () => {
console.log("All tasks complete.");
await pool.destroy();
});
pool.on("error", (error) => {
console.error("Pool error:", error);
});
```
**Manual task enqueueing example:**
```ts
const pool = new WorkerPool<number>("./worker.mjs", { threads: 3, maxQueueSize: 5 });
pool.startThreads();
const tasks = Array.from({ length: 50 }, (_, i) => i + 1);
const results: Promise<number>[] = [];
for (const n of tasks) {
while (pool.isQueueFull) {
await pool.waitForSpace(50);
}
results.push(pool.run(n));
}
const finalResults = await Promise.all(results);
console.log("Final Results:", finalResults.slice(0, 10));
await pool.destroy();
```
## Worker Example (`@ohfc/tiny-pool` worker module)
```ts
import { defineWorker } from "@ohfc/tiny-pool";
import { setTimeout as sleep } from "node:timers/promises";
defineWorker(async (data: number) => {
await sleep(1000); // simulate async task delay
return data * 2;
});
```
## API
### `new WorkerPool<T = unknown, R = unknown>(workerScript: string, options?: Partial<WorkerPoolOptions>)`
Creates a worker pool to manage multiple worker threads.
- **workerScript**: Path or content of worker script.
- **options**:
- `threads` (number): Number of worker threads to create (default: available cores - 1)
- `maxQueueSize` (number): Max tasks that can queue (default: Infinity)
- `maxMemory`, `logger`, and others inherited from `WorkerOptions`.
### Methods
- **`startThreads(): void`**
Starts the worker threads.
- **`run(taskData: T): Promise<R>`**
Enqueues a task and returns a promise that resolves with the worker’s result.
- **`fromStream(source: Readable): Promise<void>`**
Reads tasks from a Node.js Readable stream and processes them asynchronously, emitting `'data'` events with results and `'end'` when done.
- **`destroy(): Promise<void>`**
Gracefully terminates all workers, clears queues, and cleans resources.
- **`waitForSpace(intervalMs?: number): Promise<void>`**
Promise that resolves once there is space in the queue (backpressure support).
- **`isQueueFull: boolean`**
Boolean indicating if the queue is full.
- **`queueLength: number`**
Number of tasks currently queued.
## Events
- **`'data'`** (result: R): Emitted when a task completes successfully.
- **`'error'`** (err: Error): Emitted on worker or task errors.
- **`'end'`**: Emitted after the input stream ends and all tasks finish (only with `fromStream`).
## Why Use @ohfc/tiny-pool?
- Minimal dependencies and lightweight.
- Easy to integrate with streams and manual task submission.
- Built-in queue and concurrency management with backpressure support.
- Automatically restarts crashed workers.
- Typed with TypeScript for strong developer experience.
## License
MIT