任务队列
This commit is contained in:
		@@ -13,11 +13,44 @@ export default defineEventHandler(async event => {
 | 
				
			|||||||
        return { 'message': 'ok' }
 | 
					        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)
 | 
					    // 添加任务到队列(生成一个32位随机字符串作为任务ID)
 | 
				
			||||||
    if (event.node.req.method === 'POST') {
 | 
					    if (event.node.req.method === 'POST') {
 | 
				
			||||||
        event.context.body = await readBody(event) // 读取body数据到
 | 
					        event.context.body = await readBody(event) // 读取body数据到
 | 
				
			||||||
        event.context.body.tid = Math.random().toString(36).substring(2, 34)
 | 
					        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
 | 
					        return event.context.body
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user