From ccc15f412427f6b8d3f2da269410741b78b2da8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E8=8F=AF?= Date: Tue, 14 Feb 2023 01:02:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/drawing.ts | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/server/api/drawing.ts b/server/api/drawing.ts index cfa7e79..58fae05 100644 --- a/server/api/drawing.ts +++ b/server/api/drawing.ts @@ -13,11 +13,44 @@ export default defineEventHandler(async event => { return { 'message': 'ok' } } + // 抽取一组任务(优先队列里最多的模型) + if (event.node.req.method === 'PATCH') { + // 筛选出所有的任务(并打印) + let tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) + console.log(tasks) + // 按照任务的model字段分组 + let groups = tasks.reduce((groups: any, task: any) => { + let model = task.model + if (!groups[model]) { + groups[model] = [] + } + groups[model].push(task) + return groups + }) + // 按照任务数量排序 + let sorted = Object.keys(groups).sort((a, b) => groups[b].length - groups[a].length) + console.log(sorted) + + // 将抽取到的任务从队列中改变状态 + for (let task of groups[sorted[0]]) { + task.status = 'processing' + await useStorage().setItem(`task:${task.tid}`, task) + } + + // 返回数量最多的任务 + return { 'task': groups[sorted[0]][0] } + } + // 添加任务到队列(生成一个32位随机字符串作为任务ID) if (event.node.req.method === 'POST') { event.context.body = await readBody(event) // 读取body数据到 event.context.body.tid = Math.random().toString(36).substring(2, 34) - await useStorage().setItem(`task:${event.context.query.tid}`, event.context.query) + event.context.body.status = 'waiting' // 默认当前状态 + event.context.body.createdAt = new Date().getTime() // 设定创建时间 + await useStorage().setItem(`task:${event.context.body.tid}`, event.context.body) + // 筛选出所有的任务(并打印) + let tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) + console.log(tasks) // 如果无需排队,直接返回结果, 否则返回任务排队状态(预估等待时间) return event.context.body }