41 lines
881 B
TypeScript
41 lines
881 B
TypeScript
import Deferred from './Deferred';
|
|
|
|
export class Foreman {
|
|
private deferreds: Deferred[] = [];
|
|
|
|
private priorityDeferreds: Deferred[] = [];
|
|
|
|
activeWorkers = 0;
|
|
|
|
constructor(private maxWorkers: number) {
|
|
}
|
|
|
|
requestWorker(isPriority?: boolean) {
|
|
if (this.activeWorkers === this.maxWorkers) {
|
|
const deferred = new Deferred();
|
|
if (isPriority) {
|
|
this.priorityDeferreds.push(deferred);
|
|
} else {
|
|
this.deferreds.push(deferred);
|
|
}
|
|
return deferred.promise;
|
|
}
|
|
|
|
this.activeWorkers++;
|
|
return Promise.resolve();
|
|
}
|
|
|
|
releaseWorker() {
|
|
if (this.queueLength) {
|
|
const deferred = (this.priorityDeferreds.shift() || this.deferreds.shift())!;
|
|
deferred.resolve();
|
|
} else {
|
|
this.activeWorkers--;
|
|
}
|
|
}
|
|
|
|
get queueLength() {
|
|
return this.deferreds.length + this.priorityDeferreds.length;
|
|
}
|
|
}
|