django实现接口排队执行任务,并使请求立即返回队伍位置,并发接口通信

本文介绍了一个基于Django的AI绘画应用接口设计,通过引入任务排队机制来优化用户体验,特别是针对计算资源有限的情况。

最近遇到了在研究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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值