Django Celery如何实现定时任务在指定精确时间点执行?
Django Celery 每日凌晨3:20定时任务配置方案
核心cron规则说明
你需要的固定每天3:20执行的cron规则为 20 3 * * *,对应Celery的crontab配置参数直接传minute=20、hour=3即可。
cron表达式从左到右五个字段的含义分别是:分 时 日 月 周,上述规则代表任意日期、任意月份、任意星期的3点20分,完全匹配你的精确时间需求。
完整配置步骤
- 第一步:安装依赖包
django-celery-beat,这是Django整合Celery定时任务的官方组件,安装命令:pip install django-celery-beat - 第二步:修改Django项目的
settings.py配置:- 将
django_celery_beat加入INSTALLED_APPS列表 - 新增Celery定时调度及时区配置,确保Django和Celery时区一致,避免时间偏移:
TIME_ZONE = 'Asia/Shanghai' USE_TZ = True CELERY_TIMEZONE = TIME_ZONE CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' - 配置定时任务规则,示例如下:
from celery.schedules import crontab CELERY_BEAT_SCHEDULE = { 'daily_task_at_3_20': { 'task': 'your_app.tasks.your_custom_task', # 替换为你实际的任务路径 'schedule': crontab(minute=20, hour=3), # 对应3:20的cron规则 # 如有传参需求可新增args字段,示例:'args': (param1, param2) } }
- 将
- 第三步:执行数据库迁移,
django-celery-beat需要创建数据表存储定时任务相关数据,迁移命令:python manage.py migrate - 第四步:启动服务,需要同时运行Celery worker(执行任务)和Celery beat(调度任务):
启动worker命令:celery -A 你的项目名 worker --loglevel=info
启动beat命令:celery -A 你的项目名 beat --loglevel=info
生产环境建议用systemd等守护进程托管两个服务,避免进程意外退出。
补充说明
如果你需要的是间隔24小时执行,而非固定在每日3:20,可以将schedule配置改为timedelta(hours=24)即可,注意这种方式是从beat服务启动时间开始计算间隔,不会固定到凌晨3点20分执行,按需选择即可。
内容的提问来源于stack exchange,提问作者Rin
相关产品推荐
相关产品推荐

