X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FWorker.ts;h=54dcb1562df2a62846284d02c9e444e034cbc736;hb=418106c832022ba6f100f4bf81315300994bee87;hp=a4cd80a9a4ed6796408e60b1dfc0743a8dbdbea0;hpb=4fa59b8a2888956b1a74b976b47ce732970d641e;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/Worker.ts b/src/charging-station/Worker.ts index a4cd80a9..54dcb156 100644 --- a/src/charging-station/Worker.ts +++ b/src/charging-station/Worker.ts @@ -1,125 +1,18 @@ -import { Worker, WorkerOptions } from 'worker_threads'; - -import Configuration from '../utils/Configuration'; -import Constants from '../utils/Constants'; -import Pool from 'worker-threads-pool'; import WorkerData from '../types/WorkerData'; -export default class Wrk { - private _workerScript: string; - private _workerData: WorkerData; - private _worker: Worker; +export default abstract class Wrk { + protected workerScript: string; + public abstract size: number; /** * Create a new `Wrk`. * * @param {string} workerScript - * @param {WorkerData} workerData - */ - constructor(workerScript: string, workerData: WorkerData) { - this._workerData = workerData; - this._workerScript = workerScript; - if (Configuration.useWorkerPool()) { - WorkerPool.maxConcurrentWorkers = Configuration.getWorkerPoolMaxSize(); - } - } - - /** - * - * @return {Promise} - * @public - */ - async start(): Promise { - if (Configuration.useWorkerPool()) { - await this._startWorkerWithPool(); - } else { - await this._startWorker(); - } - return this._worker; - } - - /** - * - * @return {void} - * @public */ - addWorkerElement(workerData: WorkerData): void { - // FIXME: also forbid to add an element if the current number of elements > max number of elements - if (Configuration.useWorkerPool()) { - return; - } - this._workerData = workerData; - this._worker.postMessage({ id: Constants.START_WORKER_ELEMENT, workerData: workerData }); + constructor(workerScript: string) { + this.workerScript = workerScript; } - /** - * - * @return {number} - * @public - */ - public getWorkerPoolSize(): number { - if (Configuration.useWorkerPool()) { - return WorkerPool.getPoolSize(); - } - } - - /** - * - * @return {Promise} - * @private - */ - private async _startWorkerWithPool() { - return new Promise((resolve, reject) => { - WorkerPool.acquire(this._workerScript, { workerData: this._workerData }, (err, worker) => { - if (err) { - return reject(err); - } - worker.once('message', resolve); - worker.once('error', reject); - this._worker = worker; - }); - }); - } - - /** - * - * @return {Promise} - * @private - */ - private async _startWorker() { - return new Promise((resolve, reject) => { - const worker = new Worker(this._workerScript, { workerData: this._workerData }); - worker.on('message', resolve); - worker.on('error', reject); - worker.on('exit', (code) => { - if (code !== 0) { - reject(new Error(`Worker stopped with exit code ${code}`)); - } - }); - this._worker = worker; - }); - } -} - - -class WorkerPool { - public static maxConcurrentWorkers: number; - private static _instance: Pool; - - private constructor() { } - - public static getInstance(): Pool { - if (!WorkerPool._instance) { - WorkerPool._instance = new Pool({ max: WorkerPool.maxConcurrentWorkers }); - } - return WorkerPool._instance; - } - - public static acquire(filename: string, options: WorkerOptions, callback: (error: Error | null, worker: Worker) => void): void { - WorkerPool.getInstance().acquire(filename, options, callback); - } - - public static getPoolSize(): number { - return WorkerPool.getInstance().size; - } + public abstract start(): Promise; + public abstract addElement(elementData: WorkerData): void; }