我们听说过 google scheduler 中的调度器,但是您是否曾经在 Web 应用程序中使用过调度器来在固定的时间间隔内调用一些特定的方法。假设 Web 应用程序需要在每周一晚上 7:30 向用户发送邮件,然后我们使用调度程序在每周一的 19 小时 30 分钟执行定义的方法。所以今天我们就来讨论一下Django框架中俗称的celery beat 这样的调度器。
Celery beat 是一个 Python 任务调度模块。它以固定的时间间隔执行指定的任务,而不管发生任何其他过程/事件。Celery 与 Django 兼容,因为它提供了许多预定义的方法,用于按计划和定期执行异步和同步任务。让我们尝试在 Django 应用程序中使用 celery beat 构建一个周期性任务。首先,我们需要构建一个 Django 项目demo_project, 然后在其中构建一个 Django 应用程序demo_app。 这是终端语法,
$ django-admin startproject demo_project
$ cd demo_project
$ python manage.py startapp demo_app
现在,我们需要使用一个简单的命令在我们的虚拟环境中安装 celery beat,
$ pip install django-celery-beat
安装后,我们需要通过在 settings.py 中添加 2 个已安装的应用程序“demo_app” 和“django_celery_beat” 来配置我们的demo_project 的设置,如下所示,
INSTALLED_APPS = [
# other apps ...
'demo_app',
'django_celery_beat',
]
Celery beat 需要在数据库中存储一些数据,以便定期调度任务。因此,我们将通过终端语法创建相同的表,
$ python manage.py migrate
因此,我们已准备好创建我们的周期性任务。我们将在demo_app 中 创建一个名为“ tasks.py ”的新文件,然后在其中定义一个任务,该任务在每周四上午 7:30 向所有用户打印一条消息。这是任务的定义方式,
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def test(message):
print(f"Message: {message}")
然后,我们需要配置我们的 demo_project以在每周四早上 7 点 30 分执行测试任务。这可以通过在demo_project 中创建“ celery.py ”来完成,并通过使用键“task”指定 beat_schedule 字典来设置时间表, ‘schedule’ 和 ‘args’ 如下所示,
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo_project.settings')
# celery settings for the demo_project
app = Celery('demo_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
# here is the beat schedule dictionary defined
app.conf.beat_schedule = {
'print-every-thrusday': {
'task': 'demo_app.tasks.test',
'schedule': crontab(hour=7, minute=30, day_of_week=4),
'args': ('Its Thrusday!',)
},
}
app.conf.timezone = 'UTC'
app.autodiscover_tasks()
Crontab 计划有助于决定执行任务的时间,例如,一天中的特定时间或一周中的某一天,甚至一年中的某个月。通过提供该地点的纬度和经度,您可以根据日出、日落、黎明或黄昏来安排您的任务。就是这样,我们已经使用 celery beat 在一个独立于客户端 – 服务器交互的 Web 应用程序中安排了一个任务。
常见问题FAQ
程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!