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

Django集成Celery+RabbitMQ时任务一直Pending,求助排查

Celery任务Pending无法执行的问题排查与修复

核心问题分析

任务持续处于Pending状态,根源是配置冲突、结果后端设置错误以及测试代码的小问题,以下是具体修复步骤:


1. 修复Celery配置冲突(celery.py)

你的celery.py手动指定了broker和backend为AMQP地址,存在两处错误:

  • AMQP是消息中间件(Broker),不能用作结果后端(Result Backend)
  • 手动配置会与Django Settings中的设置冲突,导致Worker无法正确读取参数

修改celery.py,移除手动指定的broker/backend,完全从Django配置加载:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')

# 仅指定应用名称,不手动设置broker/backend
app = Celery('myapp')

# 从Django settings加载配置,namespace确保只读取CELERY_前缀的参数
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动发现所有app中的tasks.py
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

2. 清理Django Settings冗余配置

你的settings.py存在重复、旧版配置,统一修正为标准Celery格式:

# 移除旧版BROKER_URL,使用新版CELERY_BROKER_URL
CELERY_BROKER_URL = 'amqp://localhost'

# 结果后端使用django-db(已安装django_celery_results)
CELERY_RESULT_BACKEND = 'django-db'

# 保留有效配置,移除无CELERY前缀的冗余项
CELERY_RESULT_PERSISTENT = True
CELERY_TASK_RESULT_EXPIRES = None
CELERY_SEND_EVENTS = True
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_CACHE_BACKEND = 'django-cache'
CELERY_IGNORE_RESULT = False

注意:旧版无CELERY前缀的参数(如result_backend)会与新版配置冲突,必须移除或替换为带CELERY_前缀的版本。


3. 修正测试代码错误

测试代码存在两处问题:

  • result = add.AsyncResult(g):g本身是delay()返回的AsyncResult对象,无需再次包装
  • 批量提交任务后直接打印状态无法反映真实执行情况,g.get()会阻塞等待任务完成

修正后的测试代码:

import time

def test_multi_func():
    x = 5
    y = 10
    tasks = []
    print(f"start = {time.perf_counter()}")
    # 批量提交任务并保存所有AsyncResult对象
    for _ in range(15):
        task = add.delay(x,y)
        tasks.append(task)
    print(f"提交完成 = {time.perf_counter()}")
    
    # 等待所有任务完成并输出结果
    for task in tasks:
        print(f"任务ID: {task.id}, 状态: {task.status}, 结果: {task.get()}")
    print(f"x = {x} ; y = {y}")

4. 确保RabbitMQ服务正常运行

启动Celery Worker前,先验证RabbitMQ状态:

  • 启动服务:sudo service rabbitmq-server start(Linux)或对应Windows/macOS命令
  • 检查队列:用rabbitmqctl list_queues查看队列是否存在,确认无连接权限问题

5. 正确启动Celery Worker

在项目根目录执行以下命令启动Worker:

celery -A myapp worker -l info

-A myapp指定Celery应用为myapp,-l info打印详细日志,方便排查执行问题。


验证流程

  1. 启动RabbitMQ服务
  2. 启动Celery Worker
  3. 运行test_multi_func()函数
  4. 查看Worker日志,确认任务被接收执行;同时检查RabbitMQ队列,任务会被消费而非持续Pending

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:01:07