在 Django 项目中结合 Nginx 和 uWSGI 部署时,实现定时任务有以下几种主要方法:
pip install django-crontab
在 settings.py
中添加:
INSTALLED_APPS = [
...
'django_crontab',
...
]
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.my_scheduled_job'),
('0 0 * * *', 'django.core.management.call_command', ['clearsessions']),
]
python manage.py crontab add
python manage.py crontab show
python manage.py crontab remove
pip install celery django-celery-beat
在 settings.py
中添加:
INSTALLED_APPS = [
...
'django_celery_beat',
...
]
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TIMEZONE = 'Asia/Shanghai'
在 tasks.py
中:
from celery import shared_task
from celery.schedules import crontab
from celery.task import periodic_task
@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week=1))
def every_monday_morning():
print("This runs every Monday morning at 7:30am!")
celery -A your_project worker -l info -B
直接使用系统的 crontab 来调用 Django 管理命令:
# 编辑 crontab
crontab -e
# 添加如下内容(每5分钟运行一次)
*/5 * * * * /path/to/venv/bin/python /path/to/manage.py your_command
pip install apscheduler
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
# 添加任务
scheduler.add_job(my_job, 'interval', minutes=5)
scheduler.start()
uWSGI 的特殊考虑:
--enable-threads
选项允许线程运行Nginx 配置:
nginx
location /run-task/ {
include uwsgi_params;
uwsgi_pass unix:/path/to/yourproject.sock;
}
日志记录:
并发问题:
django-pglocks
或其他锁机制选择哪种方案取决于你的具体需求: - 简单任务:django-crontab 或系统 crontab - 复杂调度:Celery 或 APScheduler - 需要分布式任务:Celery 是最佳选择