如何使用Celery和Docker处理Django中的定期任务

2020-06-17 07:27:11易采站长站整理

- ./project/:/usr/src/app/
environment:
- DEBUG=1
- SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m
- DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on:
- redis

在构建新容器之前,我们需要在Django应用中配置Celery。

芹菜配置

设定

在“核心”目录中,创建一个celery.py文件并添加以下代码:


import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings")

app = Celery("core")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()

这里发生了什么事?

首先,我们为DJANGO_SETTINGS_MODULE环境变量设置一个默认值,以便Celery知道如何找到Django项目。

接下来,我们创建了一个名称为core的新Celery实例,并将该值分配给名为app的变量。

然后,我们从django.conf的settings对象中加载了celery配置值。 我们使用namespace =“ CELERY”来防止与其他Django设置发生冲突。 换句话说,Celery的所有配置设置必须以CELERY_为前缀。

最后,

app.autodiscover_tasks()
告诉Celery从settings.INSTALLED_APPS中定义的应用程序中查找Celery任务。

将以下代码添加到core / __ init__.py:


from .celery import app as celery_app

__all__ = ("celery_app",)

最后,使用以下Celery设置更新core / settings.py文件,使其可以连接到Redis:


CELERY_BROKER_URL = "redis://redis:6379"
CELERY_RESULT_BACKEND = "redis://redis:6379"

build:


$ docker-compose up -d --build

查看日志:


$ docker-compose logs 'web'
$ docker-compose logs 'celery'
$ docker-compose logs 'celery-beat'
$ docker-compose logs 'redis'

如果一切顺利,我们现在有四个容器,每个容器提供不同的服务。

现在,我们准备创建一个示例任务,以查看其是否可以正常工作。

创建一个任务

创建一个新文件core / tasks.py并为仅打印到控制台的示例任务添加以下代码:


from celery import shared_task

@shared_task
def sample_task():
print("The sample task just ran.")

安排任务

在settings.py文件的末尾,添加以下代码,以使用Celery Beat将sample_task安排为每分钟运行一次:


CELERY_BEAT_SCHEDULE = {
"sample_task": {
"task": "core.tasks.sample_task",
"schedule": crontab(minute="*/1"),
},
}

在这里,我们使用CELERY_BEAT_SCHEDULE设置定义了定期任务。 我们给任务命名了sample_task,然后声明了两个设置: