版本: | 2.7.0 |
---|---|
网址: | http://django-celery-beat.readthedocs.io/ |
下载: | http://pypi.python.org/pypi/django-celery-beat |
来源: | http://github.com/celery/django-celery-beat |
关键词: | django、celery、beat、周期性任务、cron、调度 |
此扩展使您能够将定期任务计划存储在数据库中。
可以从 Django 管理界面管理定期任务,您可以在其中创建、编辑和删除定期任务以及它们的运行频率。
此扩展的使用和安装说明可从 Celery 文档中获取。
警告
如果您更改 Django TIME_ZONE
设置,您的定期任务计划仍将基于旧时区。
要解决此问题,您必须重置每个定期任务的“上次运行时间”:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
笔记
这将重置状态,就好像定期任务以前从未运行过一样。
django_celery_beat.models.PeriodicTask
该模型定义了要运行的单个周期性任务。
它必须与计划关联,该计划定义任务运行的频率。
django_celery_beat.models.IntervalSchedule
以特定间隔(例如每 5 秒)运行的计划。
django_celery_beat.models.CrontabSchedule
包含诸如 cron 中的条目之类的字段的计划: minute hour day-of-week day_of_month month_of_year
。
django_celery_beat.models.PeriodicTasks
该模型仅用作跟踪时间表何时更改的索引。
每当您更新PeriodicTask
时,该表中的计数器也会增加,这会告诉celery beat
服务从数据库重新加载计划。
如果批量更新定期任务,则需要手动更新计数器:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
要创建按一定时间间隔执行的周期性任务,您必须首先创建时间间隔对象:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
这就是您需要的所有字段:周期类型和频率。
您可以在一组特定的期间之间进行选择:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
笔记
如果您有多个每 10 秒执行一次的定期任务,那么它们都应该指向同一个调度对象。
如果您需要将其呈现给用户,还可以使用“选择元组”:
>> > IntervalSchedule . PERIOD_CHOICES
现在我们已经定义了调度对象,我们可以创建周期性任务条目:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
请注意,这是一个非常基本的示例,您还可以指定用于执行任务的参数和关键字参数、将其发送到[*]的queue
,并设置到期时间。
下面是指定参数的示例,请注意 JSON 序列化的要求:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | 您还可以使用exchange 和routing_key 字段来使用低级AMQP路由。 |
crontab 计划具有以下字段: minute
、 hour
、 day_of_week
、 day_of_month
和month_of_year
,因此,如果您想要相当于30 * * * *
(每小时执行 30 分钟)的 crontab 条目,您可以指定:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
crontab 计划使用“timezone”输入参数链接到特定时区。
然后,要使用此计划创建定期任务,请使用与本文档前面基于时间间隔的定期任务相同的方法,但不指定interval=schedule
,而是指定crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
您可以使用enabled
标志暂时禁用周期性任务:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
周期性任务仍然需要“工人”来执行。因此请确保安装了默认的Celery包。 (如果未安装,请按照此处的安装说明进行操作:https://github.com/celery/celery)
Worker 和 Beat 服务需要同时运行。
启动 Celery 工作服务(指定您的 Django 项目名称):
$ celery -A [项目名称] 工人 --loglevel=info
作为一个单独的进程,启动beat服务(指定Django调度程序):
$ celery -A [项目名称]beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
或者您可以使用 -S (调度程序标志),有关更多选项,请参阅celery beat --help
):
$ celery -A [项目名称]beat -l info -S django
另外,作为一种替代方案,您可以仅使用一个命令运行上述两个步骤(worker 和beat 服务)(建议仅用于开发环境):
$ celery -A [项目名称]worker --beat --scheduler django --loglevel=info
现在您可以从 Django 管理界面添加和管理定期任务。
您可以通过 Python 包索引 (PyPI) 或从源代码安装 django-celery-beat。
使用pip
安装:
$ pip install --upgrade django-celery-beat
从 http://pypi.python.org/pypi/django-celery-beat 下载最新版本的 django-celery-beat
您可以通过执行以下操作来安装它:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
安装后,将django_celery_beat
添加到 Django 的设置模块中:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
使用以下命令运行django_celery_beat
迁移:
$ python manage.py migrate django_celery_beat
您可以使用以下 pip 命令安装 django-celery-beat 的最新主版本:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
要使用 Django admin 在 http://127.0.0.1:58000/admin/ 启动 django-celery-beat 的本地开发副本,请运行:
$ docker-compose up --build
以用户admin
和密码admin
身份登录。
如果您的项目不支持时区,则可以在设置文件中设置DJANGO_CELERY_BEAT_TZ_AWARE=False
。
django-celery-beat 和数千个其他软件包的维护者正在与 Tidelift 合作,为您用于构建应用程序的开源依赖项提供商业支持和维护。节省时间、降低风险并改善代码运行状况,同时向您使用的确切依赖项的维护者付费。了解更多。