|
1 |
| -import PLimit from 'p-limit'; |
2 |
| -import {Worker} from 'worker_threads'; |
3 |
| - |
4 |
| -import * as nodeUtils from './nodeUtils'; |
| 1 | +import pLimit, {Limit} from 'p-limit'; |
| 2 | +import {Worker} from 'worker_threads'; |
5 | 3 |
|
6 | 4 | const kTaskInfo = Symbol(`kTaskInfo`);
|
7 | 5 |
|
8 | 6 | type PoolWorker<TOut> = Worker & {
|
9 | 7 | [kTaskInfo]: null | { resolve: (value: TOut) => void, reject: (reason?: any) => void };
|
10 | 8 | };
|
11 | 9 |
|
12 |
| -export class WorkerPool<TIn, TOut> { |
| 10 | +export interface TaskPool<TIn, TOut> { |
| 11 | + run(data: TIn): Promise<TOut>; |
| 12 | +} |
| 13 | + |
| 14 | +export class AsyncPool<TIn, TOut> implements TaskPool<TIn, TOut> { |
| 15 | + private limit: Limit; |
| 16 | + |
| 17 | + constructor(private fn: (data: TIn) => Promise<TOut>, opts: {poolSize: number}) { |
| 18 | + this.limit = pLimit(opts.poolSize); |
| 19 | + } |
| 20 | + |
| 21 | + run(data: TIn) { |
| 22 | + return this.limit(() => this.fn(data)); |
| 23 | + } |
| 24 | +} |
| 25 | + |
| 26 | +export class WorkerPool<TIn, TOut> implements TaskPool<TIn, TOut> { |
13 | 27 | private workers: Array<PoolWorker<TOut>> = [];
|
14 |
| - private limit = PLimit(nodeUtils.availableParallelism()); |
| 28 | + |
15 | 29 | private cleanupInterval: ReturnType<typeof setInterval>;
|
16 | 30 |
|
17 |
| - constructor(private source: string) { |
| 31 | + private limit: Limit; |
| 32 | + |
| 33 | + constructor(private source: string, opts: {poolSize: number}) { |
| 34 | + this.limit = pLimit(opts.poolSize); |
| 35 | + |
18 | 36 | this.cleanupInterval = setInterval(() => {
|
19 | 37 | if (this.limit.pendingCount === 0 && this.limit.activeCount === 0) {
|
20 | 38 | // Start terminating one worker at a time when there are no tasks left.
|
|
0 commit comments