X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fstart.ts;h=947a1abfd15011ae208529f92f7edd1ed41cb98e;hb=418106c832022ba6f100f4bf81315300994bee87;hp=1c91dea361f5e5b9224ce6f8d6529e5758d524b4;hpb=eb3937cbf02c9f5000d7466afef0036639a3ddc4;p=e-mobility-charging-stations-simulator.git diff --git a/src/start.ts b/src/start.ts index 1c91dea3..947a1abf 100644 --- a/src/start.ts +++ b/src/start.ts @@ -1,36 +1,71 @@ import Configuration from './utils/Configuration'; -import { StationTemplateURL } from './types/ConfigurationData'; -import Wrk from './charging-station/Worker'; +import Constants from './utils/Constants'; +import Utils from './utils/Utils'; +import WorkerData from './types/WorkerData'; +import WorkerGroup from './charging-station/WorkerGroup'; +import WorkerPool from './charging-station/WorkerPool'; class Bootstrap { - static start() { + static async start() { try { let numStationsTotal = 0; + let numConcurrentWorkers = 0; + const chargingStationsPerWorker = Configuration.getChargingStationsPerWorker(); + let chargingStationsPerWorkerCounter = 0; + let workerImplementation: WorkerGroup | WorkerPool; + if (Configuration.useWorkerPool()) { + workerImplementation = new WorkerPool('./dist/charging-station/StationWorker.js'); + void workerImplementation.start(); + } // Start each ChargingStation object in a worker thread if (Configuration.getStationTemplateURLs()) { - Configuration.getStationTemplateURLs().forEach((stationURL: StationTemplateURL) => { + for (const stationURL of Configuration.getStationTemplateURLs()) { try { const nbStations = stationURL.numberOfStations ? stationURL.numberOfStations : 0; - numStationsTotal += nbStations; for (let index = 1; index <= nbStations; index++) { - const worker = new Wrk('./dist/charging-station/StationWorker.js', { + const workerData: WorkerData = { index, - templateFile: stationURL.file, - }, numStationsTotal); - worker.start().catch(() => {}); + templateFile: stationURL.file + }; + if (Configuration.useWorkerPool()) { + void workerImplementation.addElement(workerData); + numConcurrentWorkers = workerImplementation.size; + numStationsTotal = workerImplementation.size; + // Start worker sequentially to optimize memory at start time + await Utils.sleep(Constants.START_WORKER_DELAY); + } else { + // eslint-disable-next-line no-lonely-if + if (chargingStationsPerWorkerCounter === 0 || chargingStationsPerWorkerCounter >= chargingStationsPerWorker) { + // Start new WorkerGroup with one charging station + workerImplementation = new WorkerGroup('./dist/charging-station/StationWorker.js', workerData, chargingStationsPerWorker); + void workerImplementation.start(); + numConcurrentWorkers++; + chargingStationsPerWorkerCounter = 1; + numStationsTotal++; + // Start worker sequentially to optimize memory at start time + await Utils.sleep(Constants.START_WORKER_DELAY); + } else { + // Add charging station to existing WorkerGroup + void workerImplementation.addElement(workerData); + chargingStationsPerWorkerCounter++; + numStationsTotal++; + } + } } } catch (error) { // eslint-disable-next-line no-console console.log('Charging station start with template file ' + stationURL.file + ' error ' + JSON.stringify(error, null, ' ')); } - }); + } } else { console.log('No stationTemplateURLs defined in configuration, exiting'); } if (numStationsTotal === 0) { console.log('No charging station template enabled in configuration, exiting'); + } else if (Configuration.useWorkerPool()) { + console.log('Charging station simulator started with ' + numStationsTotal.toString() + ' charging station(s) and ' + numConcurrentWorkers.toString() + '/' + Configuration.getWorkerPoolMaxSize().toString() + ' worker(s) concurrently running'); } else { - console.log('Charging station simulator started with ' + numStationsTotal.toString() + ' charging station(s)'); + console.log('Charging station simulator started with ' + numStationsTotal.toString() + ' charging station(s) and ' + numConcurrentWorkers.toString() + ' worker(s) concurrently running'); } } catch (error) { // eslint-disable-next-line no-console @@ -39,4 +74,8 @@ class Bootstrap { } } -Bootstrap.start(); +Bootstrap.start().catch( + (error) => { + console.error(error); + } +);