最近遇到了在研究AI绘画时发现,把AI绘画计算写成接口,所等待时间计算的时间还是相当长(没钱换高端计算显卡)为了更好的解决这个问题,用django在写接口的时候,设计了一套符合现行要求的排队等待的接口逻辑

执行项目接口前,要先把django-q的线程跑起来,方便拿到的任务执行id,从里面查询结果
废话不多说,直接上后台代码
from django_q.tasks import async_task,Task,result
from queue import Queue
# 排队接口,实现排队整体逻辑,立即返回接口,不允许堵塞
@csrf_exempt
def add(request, *args, **kwargs):
info = request.request_data
session_hash = info['ssh']
Ftransinfo = info['Ftag']
Ntransinfo = info['Ntag']
databaseURL = 'http://127.0.0.1:7860/api/'
# 排队逻辑
try:
# 判空
if iq.empty() == True:
iq.put(session_hash)
task_id = async_task(getPaint, Ftransinfo, Ntransinfo, session_hash,databaseURL)
print(task_id)
# 返回任务id
return JsonResponse({'status': 200, 'msg': 'success',
'data': {'result': 'over', 'tip': '排队完成', 'task_id': task_id,
'session_hash': session_hash}})
else:
# 判断绘画请求是否已经在队伍中
if (session_hash in iq.queue) == True:
iq_count = iq.queue.index(session_hash)
print(iq_count)
# 如果排到自己,django-q返回线程中执行任务的任务id
if iq_count == 0:
task_id = async_task(getPaint, Ftransinfo, Ntransinfo, session_hash, databaseURL)
print(task_id)
# 返回任务号
return JsonResponse({'status': 200, 'msg': 'success',
'data': {'result': 'over', 'tip': '', 'task_id': task_id,
'session_hash': session_hash}})
# 否则立即返回请求在队伍中的位置
else:
if (iq_count * 15) > 60:
return JsonResponse({'status': 200, 'msg': 'success', 'data': {'result': 'queueing',
'tip': '目前请求人数较多,共有' + str(
iq_count) + '人在排队,预计还需' + str(
(iq_count * 15) / 60) + '分钟排队完成...',
'session_hash': session_hash}})
else:
return JsonResponse({'status': 200, 'msg': 'success', 'data': {'result': 'queueing',
'tip': '目前请求人数较多,共有' + str(
iq_count) + '人在排队,预计还需' + str(
iq_count * 15) + '秒排队完成...',
'session_hash': session_hash}})
else:
iq_size = iq.qsize()
print(iq_size)
if (iq_size * 15) > 60:
iq.put(session_hash)
return JsonResponse({'status': 200, 'msg': 'success', 'data': {'result': 'queueing',
'tip': '目前请求人数较多,共有' + str(
iq_size) + '人在排队,预计还需' + str((
iq_size * 15) / 60) + '分钟排队完成...',
'session_hash': session_hash}})
else:
iq.put(session_hash)
return JsonResponse({'status': 200, 'msg': 'success', 'data': {'result': 'queueing',
'tip': '目前请求人数较多,共有' + str(
iq_size) + '人在排队,预计还需' + str(
iq_size * 15) + '秒排队完成...',
'session_hash': session_hash}})
except BaseException as e:
print(e)
return JsonResponse({'status':500,'msg':'error','data':{'result':'over','tip':'接口错误,请重新尝试','session_hash':session_hash}})
# 查询接口
@csrf_exempt
def getResult(request):
# 获取任务id和请求识别号
ssh = request.request_data['ssh']
taskid = request.request_data['id']
try:
# 根据任务id在线程中查询执行结果并返回
task_result = result(taskid)
print(task_result)
if task_result != None:
iq.get(ssh)
iq.task_done()
return JsonResponse({'status': 200, 'msg': 'success',
'data': {'result': 'over', 'tip': '请求完成', 'filename': task_result}})
else:
return JsonResponse({'status': 200, 'msg': 'success', 'data': {'result': 'painting', 'tip': 'AI正在处理,请稍后...'}})
except BaseException as e:
print(e)
return JsonResponse({'status':500,'msg':'error','data':{'result':'over','tip':'接口错误,请重新尝试'}})
# 初始化空队列
iq = Queue(maxsize=0)
本文介绍了一个基于Django的AI绘画应用接口设计,通过引入任务排队机制来优化用户体验,特别是针对计算资源有限的情况。
9075

被折叠的 条评论
为什么被折叠?



