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

Django background task无法运行:执行process_tasks无响应或耗时过长

Django Background Task 无响应/执行缓慢问题排查方案

1. 确认任务是否被正确调度

  • @background装饰的函数必须被调用才会生成任务,仅定义函数不会自动触发。需要在视图、管理命令或其他业务逻辑中执行notify_user(),任务才会被写入数据库的任务表(默认表名background_task),等待process_tasks处理。
  • 可以直接查看数据库的background_task表,确认是否存在未处理的任务记录,判断任务是否被成功添加。

2. 修复日志输出,定位执行状态

  • 当前代码中的logger.info("Task started")可能因Django日志未配置而无法输出。在settings.py中添加基础日志配置,确保能看到任务执行的实时日志:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
}
  • 重新运行python manage.py process_tasks,如果能看到"Task started"日志,说明任务已启动,问题出在后续代码;如果看不到,说明任务根本未被调度。

3. 排查SMTP连接阻塞问题

  • Gmail认证问题:若账号开启了两步验证,必须使用应用专用密码而非普通密码登录;未开启两步验证的账号需允许低安全性应用访问(不推荐,建议开启两步验证并使用应用密码)。
  • 添加SMTP超时设置:当前代码未设置超时,若SMTP连接卡住会导致任务无限阻塞。修改SMTP初始化代码:
with smtplib.SMTP_SSL(smtp_server, port, context=context, timeout=10) as server:
    server.login(sender, password)
    print("Yes")
  • 单独测试SMTP逻辑:写一个独立脚本测试Gmail SMTP登录,确认这部分是否耗时过长或失败:
import smtplib
import ssl

smtp_server = "smtp.gmail.com"
port = 465
sender = "你的邮箱地址"
password = "应用专用密码"

context = ssl.create_default_context()
try:
    with smtplib.SMTP_SSL(smtp_server, port, context=context, timeout=10) as server:
        server.login(sender, password)
        print("SMTP登录成功")
except Exception as e:
    print(f"SMTP错误: {e}")

4. 检查数据库连接状态

  • Django Background Task依赖数据库存储任务队列,若数据库服务(如MySQL、PostgreSQL)未正常运行,或settings.py中的数据库配置错误,会导致任务读取、执行延迟。确认数据库服务正常,连接配置无误。

5. 优化任务冗余逻辑

  • 当前代码最后一行user = get_user_model()仅获取模型类,无实际业务作用,可直接移除,减少不必要的执行步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:51:19