From c912a3f5ae230324a13bc2da48a818ba9e40707d Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Sat, 26 Jul 2025 21:21:21 +1000 Subject: [PATCH] Try to increase throughput --- deno_server.ts | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/deno_server.ts b/deno_server.ts index dce5db7..6350edf 100644 --- a/deno_server.ts +++ b/deno_server.ts @@ -23,21 +23,35 @@ for (let i = 0; i < numWorkers; i++) { workerPool.push({ worker, inUse: false }); } +const requestQueue: (( + value: + | { worker: Worker; inUse: boolean } + | PromiseLike<{ worker: Worker; inUse: boolean }> +) => void)[] = []; + function getAvailableWorker() { return new Promise((resolve) => { - const check = () => { - const availableWorker = workerPool.find((w) => !w.inUse); - if (availableWorker) { - availableWorker.inUse = true; - resolve(availableWorker); - } else { - setTimeout(check, 100); // Check again in 100ms. - } - }; - check(); + const availableWorker = workerPool.find((w) => !w.inUse); + if (availableWorker) { + availableWorker.inUse = true; + resolve(availableWorker); + } else { + requestQueue.push(resolve); + } }); } +function releaseWorker(worker) { + if (requestQueue.length > 0) { + const nextRequest = requestQueue.shift(); + if (nextRequest) { + nextRequest(worker); + } + } else { + worker.inUse = false; + } +} + async function handler(req: Request): Promise { if (req.method !== "POST" || new URL(req.url).pathname !== "/execute") { return new Response("Not Found", { status: 404 }); @@ -95,7 +109,7 @@ async function handler(req: Request): Promise { } catch (e) { return new Response(`Bad Request: ${e.message}`, { status: 400 }); } finally { - availableWorker.inUse = false; // Release the worker. + releaseWorker(availableWorker); // Release the worker. } }