您的位置:

Django Celery Beat 实现定时任务

随着Web应用程序的规模和复杂性的增加,执行一些长时间运行的任务,例如数据清理,报表生成等不适宜放到Web请求周期中,而应该作为一项后台处理任务进行。对于这类任务,我们通常使用Celery作为任务队列,但Celery本身不提供定时任务调度的功能,因此需要使用Celery Beat。

一、安装Django Celery Beat

首先,我们需要安装Django Celery Beat:

pip install django-celery-beat

并将其添加到INSTALLED_APPS中:

# settings.py

INSTALLED_APPS = [
    ...
    'django_celery_beat',
]

二、配置Celery Beat

要在应用程序使用Celery Beat,必须配置Celery Beat的调度器。我们可以使用文件(也可以使用数据库,或任何Celery支持的后端)来配置调度器。在项目的根目录创建一个名为celery.py的文件,并添加以下内容:

# celery.py

import os
from celery import Celery
from datetime import timedelta

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')

app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
    'task-name': {
        'task': 'myapp.tasks.task_name',
        'schedule': timedelta(seconds=60),
    },
}
app.autodiscover_tasks()

这定义了一个名为task-name的简单任务,它将在60秒后运行。其中,'myapp.tasks.task_name'是将要运行的任务的路径。schedule定义执行任务的频率,timedelta(seconds=60)表示每60秒运行一次。

最后一步是启动Celery Beat调度器,并将其绑定到Django。

# celery.py

from celery import Celery
from django.conf import settings
from datetime import timedelta

app = Celery('my_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
    'task-name': {
        'task': 'myapp.tasks.task_name',
        'schedule': timedelta(seconds=60),
    },
}

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

现在,我们已经让Celery Beat调度器知道了要执行的任务及其频率。接下来我们需要为这个任务写一个处理函数。

三、编写Celery任务

在我们的应用程序中,创建一个tasks.py文件,并在其中添加以下内容:

# tasks.py

from celery.decorators import task

@task
def task_name():
    # do something here

任务的处理函数可以根据具体需要实现。这里,我们仅仅定义了一个空函数。

四、启动Celery Worker和Beat

我们已经配置好了Celery Beat任务调度器并编写了处理任务的处理函数。要启动这两个服务,需要在终端中执行以下命令。

$ celery -A my_project worker -l info
$ celery -A my_project beat -l info

现在,Celery Beat将会在每60秒调用我们的任务处理函数。

五、调整Celery Beat的配置和API

在上面的示例中,我们定义了一个简单的任务调度程序示例。Celery Beat还提供了更多高级功能和选项,可以通过设置Celery配置来更改其设置。

更多信息请查看Django Celery Beat文档:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html#django-celery-beat-database-backed-periodic-tasks