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
相关产品推荐
相关产品推荐

