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

Celery+RabbitMQ项目取任务结果无响应,疑Redis连接异常

问题原因与修复方案

核心问题:请求阻塞

页面一直加载的直接原因是/result/<task_id>视图里的task.get()调用——这个方法默认会阻塞等待任务完成,只要任务还处于PENDING或STARTED状态,请求就会一直挂起,直到任务结束才返回内容。

代码修复

1. 移除阻塞调用,优化状态判断

修改result视图,去掉不必要的阻塞代码,同时完善任务不存在的判断逻辑:

@app.route('/result/<task_id>')
def result(task_id):
    task = add_numbers.AsyncResult(task_id)
    
    # 判断任务是否为无效ID(PENDING状态可能对应不存在的任务)
    if task.state == 'PENDING':
        # 直接检查Redis中是否存在任务元数据
        if not task.backend.get(f'celery-task-meta-{task_id}'):
            return f'任务ID {task_id}不存在'
        return f'任务 {task_id} 正在执行中(状态:{task.state})'
    elif task.state == 'SUCCESS':
        return f'结果:{task.get()}'
    else:
        # 处理失败、重试等其他状态
        return f'任务 {task_id} 状态:{task.state}'

2. 验证Redis连接是否正常

如果修复后仍有问题,按以下步骤排查Redis:

  • 检查Redis服务状态:执行redis-cli ping,返回PONG表示服务正常。
  • 查看Celery Worker日志,确认是否有Redis连接错误(如ConnectionError)。
  • 手动验证结果存储:在Redis客户端中执行GET celery-task-meta-<你的任务ID>,能返回JSON格式结果则说明存储正常。

3. 可选:给get()添加超时保护

如果必须在非成功状态下调用get(),建议添加超时时间避免永久阻塞:

# 仅作示例,非必要场景不推荐
try:
    result = task.get(timeout=3)
except Exception as e:
    return f'获取结果超时:{str(e)}'

额外注意事项

  • Celery Worker必须和Flask应用使用完全一致的Redis后端配置,否则无法读取任务结果。
  • 确保RabbitMQ、Redis服务正常运行,且Celery Worker已启动(启动命令:celery -A 你的应用文件名 worker --loglevel=info)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:12