1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2025-07-01 00:45:22 +02:00
Files
pigallery2/src/backend/model/fileaccess/TaskExecuter.ts
sarayourfriend fcdb2f2938 Revert "Always use Logger class and try to log once per event"
This reverts commit a57a717717a676555b4e28d5746828477c2f9811.
2024-03-31 09:45:16 +11:00

37 lines
989 B
TypeScript

import {TaskQue} from './TaskQue';
import {EventLoopHandler} from '../EventLoopHandler';
export interface ITaskExecuter<I, O> {
execute(input: I): Promise<O>;
}
export class TaskExecuter<I, O> implements ITaskExecuter<I, O> {
private taskQue = new TaskQue<I, O>();
private taskInProgress = 0;
private readonly el = new EventLoopHandler();
private run = async () => {
if (this.taskQue.isEmpty() || this.taskInProgress >= this.size) {
return;
}
this.taskInProgress++;
const task = this.taskQue.get();
try {
task.promise.resolve(await this.worker(task.data));
} catch (err) {
task.promise.reject(err);
}
this.taskQue.ready(task);
this.taskInProgress--;
this.el.step(this.run);
};
constructor(private size: number, private worker: (input: I) => Promise<O>) {
}
execute(input: I): Promise<O> {
const promise = this.taskQue.add(input).promise.obj;
this.run().catch(console.error);
return promise;
}
}