From 0078626d7c57a4bf5e138654f7b3481083f1a195 Mon Sep 17 00:00:00 2001 From: HF Date: Tue, 21 Jun 2022 04:39:07 +0200 Subject: [PATCH] make quue for tileserver thread --- src/core/tileserver.js | 64 ++++++++++++++++++++++----------------- src/workers/tilewriter.js | 19 ++++-------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/core/tileserver.js b/src/core/tileserver.js index 93b05aa..74f081e 100644 --- a/src/core/tileserver.js +++ b/src/core/tileserver.js @@ -26,6 +26,28 @@ const CanvasUpdaters = {}; */ const worker = new Worker('./workers/tilewriter.js'); +/* + * queue of tasks that is worked on in FIFO + */ +const taskQueue = []; + +function enqueueTask(task) { + if (!taskQueue.length) { + worker.postMessage(task); + } + taskQueue.push(task); +} + +worker.on('message', () => { + taskQueue.shift(); + if (taskQueue.length) { + worker.postMessage(taskQueue[0]); + } +}); + +/* + * every canvas gets an instance of this class + */ class CanvasUpdater { TileLoadingQueues; id; @@ -58,7 +80,7 @@ class CanvasUpdater { const cy = Math.floor(tile / width); if (zoom === this.maxTiledZoom - 1) { - worker.postMessage({ + enqueueTask({ task: 'createZoomTileFromChunk', args: [ this.id, @@ -68,7 +90,7 @@ class CanvasUpdater { ], }); } else if (zoom !== this.maxTiledZoom) { - worker.postMessage({ + enqueueTask({ task: 'createZoomedTile', args: [ this.canvas, @@ -79,7 +101,7 @@ class CanvasUpdater { } if (zoom === 0) { - worker.postMessage({ + enqueueTask({ task: 'createTexture', args: [ this.id, @@ -115,31 +137,10 @@ class CanvasUpdater { ); } - initializeTiles() { - return new Promise((resolve) => { - worker.postMessage({ - task: 'initializeTiles', - args: [ - this.id, - this.canvas, - this.canvasTileFolder, - false, - ], - }); - worker.once('message', (msg) => { - logger.info( - // eslint-disable-next-line max-len - `Tiling: Worker thread finished initializing Tiles with message ${msg}`, - ); - resolve(); - }); - }); - } - /* * initialize queues and start loops for updating tiles */ - async initialize() { + initialize() { logger.info(`Tiling: Using folder ${this.canvasTileFolder}`); if (!fs.existsSync(`${this.canvasTileFolder}/0`)) { if (!fs.existsSync(this.canvasTileFolder)) { @@ -148,7 +149,15 @@ class CanvasUpdater { logger.warn( 'Tiling: tiledir empty, will initialize it, this can take some time', ); - await this.initializeTiles(); + enqueueTask({ + task: 'initializeTiles', + args: [ + this.id, + this.canvas, + this.canvasTileFolder, + false, + ], + }); } for (let c = 0; c < this.maxTiledZoom; c += 1) { this.TileLoadingQueues.push([]); @@ -185,8 +194,7 @@ export async function startAllCanvasLoops() { if (!canvas.v) { // just 2D canvases const updater = new CanvasUpdater(id); - // eslint-disable-next-line no-await-in-loop - await updater.initialize(); + updater.initialize(); CanvasUpdaters[id] = updater; } } diff --git a/src/workers/tilewriter.js b/src/workers/tilewriter.js index 21828dc..658bdbb 100644 --- a/src/workers/tilewriter.js +++ b/src/workers/tilewriter.js @@ -27,34 +27,27 @@ connectRedis() try { switch (task) { case 'createZoomTileFromChunk': - createZoomTileFromChunk(...args); + await createZoomTileFromChunk(...args); break; case 'createZoomedTile': - createZoomedTile(...args); + await createZoomedTile(...args); break; case 'createTexture': - createTexture(...args); + await createTexture(...args); break; case 'initializeTiles': - try { - await initializeTiles(...args); - parentPort.postMessage('Done!'); - } catch (err) { - console.warn( - // eslint-disable-next-line max-len - `Tiling: Error on initializeTiles args ${args}: ${err.message}`, - ); - parentPort.postMessage('Failure!'); - } + await initializeTiles(...args); break; default: console.warn(`Tiling: Main thread requested unknown task ${task}`); } + parentPort.postMessage('Done!'); } catch (error) { console.warn( // eslint-disable-next-line max-len `Tiling: Error on executing task ${task} args ${args}: ${error.message}`, ); + parentPort.postMessage('Failure!'); } }); });