Standardize compute job concurrency configuration by introducing a shared COMPUTE_JOB_CONCURRENCY setting, replacing separate PDF and Whisper concurrency controls. Add cross-platform CPU core detection and thread budgeting utilities, and update both ONNX model execution and concurrency limiters to use dynamic thread allocation per job. Refactor environment variable docs and examples to reflect unified concurrency management. Streamline PDF.js font path resolution for improved reliability across environments.
41 lines
1 KiB
TypeScript
41 lines
1 KiB
TypeScript
import { getComputeJobConcurrency } from '@/lib/server/compute/cpu-budget';
|
|
|
|
export class ConcurrencyLimiter {
|
|
private readonly maxInFlight: number;
|
|
private inFlight = 0;
|
|
private readonly queue: Array<() => void> = [];
|
|
|
|
constructor(limit: number) {
|
|
this.maxInFlight = Number.isFinite(limit) && limit >= 1 ? Math.floor(limit) : 1;
|
|
}
|
|
|
|
async run<T>(fn: () => Promise<T>): Promise<T> {
|
|
await this.acquire();
|
|
try {
|
|
return await fn();
|
|
} finally {
|
|
this.release();
|
|
}
|
|
}
|
|
|
|
private acquire(): Promise<void> {
|
|
if (this.inFlight < this.maxInFlight) {
|
|
this.inFlight += 1;
|
|
return Promise.resolve();
|
|
}
|
|
return new Promise((resolve) => {
|
|
this.queue.push(() => {
|
|
this.inFlight += 1;
|
|
resolve();
|
|
});
|
|
});
|
|
}
|
|
|
|
private release(): void {
|
|
this.inFlight = Math.max(0, this.inFlight - 1);
|
|
const next = this.queue.shift();
|
|
if (next) next();
|
|
}
|
|
}
|
|
|
|
export const LOCAL_COMPUTE_LIMITER = new ConcurrencyLimiter(getComputeJobConcurrency());
|