该插件从 Django 管理界面管理celery的定期任务,您可以在其中动态****创建、编辑和删除定期任务以及它们的运行频率。
django-celery-beat
提供了几种添加定时或周期性任务的方式,
- 预先在在
settings.py
中添加好定时任务。 - 通过Django admin后台动态添加。(实际上就是操作model模型类)
- 通过提供了model模型类操作并添加。
安装和基本使用
- 安装
pip install django-celery-beat
- 将
django_celery_beat
模块添加到 Django 项目的settings.py
中的INSTALLED_APPS
中:
INSTALLED_APPS = (
...,
'django_celery_beat',
)
- 应用 Django 数据库迁移以便创建必要的表
python manage.py migrate django_celery_beat
- 使用
django_celery_beat.schedulers:DatabaseScheduler
调度程序启动 celery beat 服务。
$ celery -A proj beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler [-P eventlet]
如果觉得麻烦可以提前设置好celery的beart-scheduler选项:
https://docs.celeryq.dev/en/latest/userguide/configuration.html#beat-scheduler
或者可以用下面这个命令方式,可以快捷指定为django_celery_beat.schedulers:DatabaseScheduler
$ celery -A [project-name] beat -l info -S django [-P eventlet]
开发环境下,为了方便,可以将worker和beat一起用一条命令启动(生产环境不允许这样做!!!!)【windows不支持!】
$ celery -A [project-name] worker --beat --scheduler django --loglevel=info [-P eventlet]
# windows 记得用eventlet来启动,不然挂挂...
- 访问django Admin后台,就可以直接管理任务了!
注意:celery.backend_cleanup
任务是自动生成的,不要去删他...是用来清除存储在result_backend中的任务执行结果。
关于时区的重要警告
如果您更改 Django TIME_ZONE
选项设置,您的定期任务计划仍将基于旧时区。
要解决这个问题,您必须重置每个定期任务的“上次运行时间”:
>>> from django_celery_beat.models import PeriodicTask, PeriodicTasks
>>> PeriodicTask.objects.all().update(last_run_at=None)
>>> for task in PeriodicTask.objects.all():
>>> PeriodicTasks.changed(task)
Note:这将重置状态,就好像定期任务以前从未运行过一样。
操作django_celery_beat提供的model动态添加任务
https://pypi.org/project/django-celery-beat/
https://docs.celeryq.dev/en/latest/userguide/periodic-tasks.html
https://django-celery-beat.readthedocs.io/en/latest/
模型:
django_celery_beat.models.PeriodicTask
- 该模型定义了要运行的单个周期性任务,与下面4个调度器模型一起使用。
django_celery_beat.models.IntervalSchedule
- 用于定义时间间隔,比如,每2分钟、每1小时。
django_celery_beat.models.CrontabSchedule
- 用于定义类似linux的crontab任务(conrtab实际上可以涵盖
IntervalSchedule
)
- 用于定义类似linux的crontab任务(conrtab实际上可以涵盖
django_celery_beat.models.SolarSchedule
- 用于定义:基于太阳升起、日落、经度纬度来定义任务执行【一般用不上...】
django_celery_beat.models.ClockedSchedule
- 定义指定日期时间执行任务。比如:我要2023年1月1号,10点10分30秒执行。
查看所有周期性任务:
>>> from django_celery_beat.models import CrontabSchedule, PeriodicTask
>>> PeriodicTask.objects.all()
<PeriodicTaskQuerySet [<PeriodicTask: test add: 每 分钟>, <PeriodicTask: celery.backend_cleanup: 0 4 * * * (m/h/dM/MY/d) Asia/Shanghai>, <PeriodicTask: add every 2min gen index page: */2 * * * * (m/h/dM/MY/d) Asia/Shanghai>]>
标签:插件,beat,PeriodicTask,django,celery,models,任务
From: https://www.cnblogs.com/juelian/p/17742100.html