Django集成Celery+Redis后任务需手动启动Worker,如何实现自动执行?
解决Celery任务无法自动执行的问题
核心原因
你手动执行python -m celery -A django_celery worker -l info时,Worker是前台运行状态,关闭终端后进程就会终止,导致用户调用.delay()时没有Worker进程处理任务。要实现任务自动执行,必须让Celery Worker作为常驻后台服务持续运行。
具体解决方案
1. 用systemd配置Celery常驻服务(推荐)
通过systemd配置服务,让Celery Worker随系统开机自动启动,进程意外终止时也会自动重启。
- 创建systemd服务文件:
sudo nano /etc/systemd/system/celery.service
- 写入以下配置(根据你的实际路径修改占位内容):
[Unit] Description=Celery Worker Service After=network.target redis-server.service [Service] Type=forking User=你的服务器用户名 Group=你的服务器用户组 WorkingDirectory=/path/to/your/django/project Environment="PATH=/path/to/your/venv/bin" ExecStart=/path/to/your/venv/bin/celery multi start w1 -A django_celery -l info --pidfile=/var/run/celery/%n.pid --logfile=/var/log/celery/%n%I.log ExecStop=/path/to/your/venv/bin/celery multi stopwait w1 --pidfile=/var/run/celery/%n.pid ExecReload=/path/to/your/venv/bin/celery multi restart w1 -A django_celery -l info --pidfile=/var/run/celery/%n.pid --logfile=/var/log/celery/%n%I.log [Install] WantedBy=multi-user.target
- 创建日志和进程ID存储目录:
sudo mkdir -p /var/run/celery sudo mkdir -p /var/log/celery sudo chown 你的服务器用户名:你的服务器用户组 /var/run/celery /var/log/celery
- 启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start celery sudo systemctl enable celery
- 检查服务运行状态:
sudo systemctl status celery
确保输出显示active (running)状态。
2. 验证Celery基础配置
确认Django项目中Celery配置无错误:
- 检查Celery实例文件(通常是
celery.py)是否正确加载Django配置:
import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings') app = Celery('django_celery') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks()
- 确认
settings.py中的Redis broker配置正确:
CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
- 确保Redis服务处于运行状态:
sudo systemctl status redis-server
3. 测试任务执行
完成配置后,调用一次.delay()触发任务,然后查看Celery日志确认任务被处理:
tail -f /var/log/celery/w1.log
如果日志中出现任务执行的相关记录,说明配置生效。
内容的提问来源于stack exchange,提问作者Sapna Sharma
相关产品推荐
相关产品推荐

