You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-rq队列始终为空,如何获取已完成异步任务结果?

解决django-rq任务在FinishedJobRegistry中无法获取结果的问题

首先得解释你遇到的队列空现象:你的processImage任务大概率执行速度极快,刚被入队就被RQ Worker处理完成了,所以队列q会立刻变空,任务直接进入FinishedJobRegistry,这是正常流程,不用慌。

一、从FinishedJobRegistry获取任务结果

要拿到已完成任务的结果,你可以通过job_id直接获取Job对象,然后读取它的result属性。修改你的ceremony视图如下:

def ceremony(request): #third view, retrieves the result
    template = loader.get_template('pepper/ceremony.html')
    # 别用全局变量存job_id,多用户访问会冲突,存在session里更稳妥
    target_job_id = request.session.get('last_job_id')
    if not target_job_id:
        return HttpResponse(template.render({'error': 'No pending job found'}, request))
    
    registry = FinishedJobRegistry('default', connection=redis_conn)
    finished_job_ids = registry.get_job_ids()
    
    if target_job_id in finished_job_ids:
        # 通过job_id直接获取Job对象
        job = django_rq.get_job(target_job_id)
        if job:
            # 拿到任务执行结果
            task_result = job.result
            context = {'result': task_result}
            return HttpResponse(template.render(context, request))
    
    # 如果任务还没完成(不在FinishedRegistry里),可以给用户提示
    return HttpResponse(template.render({'message': 'Task is still processing, please wait...'}, request))

同时,把wait视图里的全局变量last_job_id改成存在session中:

def wait(request): #second view, starts the job
    template = loader.get_template('pepper/wait.html')
    job = q.enqueue(processImage)
    # 将job_id存入session
    request.session['last_job_id'] = job.id
    return HttpResponse(template.render({}, request))

二、确保任务正确入队的注意事项

  1. 确认RQ Worker正在运行
    必须启动对应Worker进程才能处理队列任务,在项目根目录执行:

    python manage.py rqworker default
    

    你的任务已经出现在FinishedJobRegistry里,说明Worker是正常运行的,但如果后续遇到任务不执行的情况,先检查Worker状态。

  2. 测试队列持有任务的情况
    如果想验证队列是否能正确持有任务,可以给任务加个延迟执行,这样任务会在队列里等待一段时间,此时q.is_empty()就会返回False:

    job = q.enqueue(processImage, delay=10)  # 延迟10秒执行任务
    
  3. 规范使用django-rq的@job装饰器
    确保你的processImage函数被正确装饰,让django-rq更好地管理任务生命周期:

    from django_rq import job
    
    @job('default')
    def processImage():
        # 你的图片处理逻辑
        # 比如返回处理后的图片路径或状态信息
        return "Image processed successfully"
    

额外提示

  • FinishedJobRegistry默认会保留已完成任务500秒,如果你需要长期保存任务结果,建议自己把结果存入数据库,不要依赖RQ的注册表。
  • 绝对避免用全局变量存储last_job_id,多用户同时访问时会导致数据混乱,session是更安全的选择。

内容的提问来源于stack exchange,提问作者Caterina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:12:57