Django中使用celery
celery实例创建
注意
以前版本的Celery需要一个单独的库才能与Django一起使用,但是从3.1开始,情况不再如此。现成的支持Django,因此本文档仅包含集成Celery和Django的基本方法。您将使用与非Django用户相同的API,因此建议您先阅读“ 使用Celery的第一步”教程,然后再返回本教程。当您有可用的示例时,可以继续阅读“ 下一步”指南。
注意
Celery 4.0支持Django 1.8和更高版本。对于Django 1.8之前的版本,请使用Celery 3.1。
要将Celery与Django项目一起使用,您必须首先定义Celery库的实例(称为“应用”)
如果您拥有现代的Django项目布局,例如:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
那么建议的方法是创建一个新的proj / proj / celery.py模块,该模块定义Celery实例:
文件:proj/proj/celery.py
# 导入future 模块,让我们的celery.py 不会与其他类库产生冲突。
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# 在celery应用中加载Django的配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
# 实例化celery对象
app = Celery(
'proj',
# 使用redis的1号库作为消息列队
broker="redis://127.0.0.1:6379/1",
# 使用redis的2号库存储任务结果
backend="redis://127.0.0.1:6379/2",
)
# 把celery的配置放到django的settings配置文件中
# 此处的参数你可以传递对象,但是建议字符串,这样使用windows 或execv 的时候,无需序列化对象。
# - namespace='CELERY' 表示所有celery相关的配置参数需要添加`CELERY_` 前缀
app.config_from_object('django.conf:settings', namespace='CELERY')
# 这个配置,让celery 自动发现django app 下定义的task 时, django app下的task 文件名 必须为 tasks.py
# 这样就不必在各个模块手动添加到CELERY_IMPORTS参数。lambda 函数会使app在调用的时候能够被自动的发现,并且使你输入的模块不会影响Django的设置对象。
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# 导入任务,有autodiscover_tasks会自动获取应用中的tasks任务,如果我们需要倒入额外的则需要通过CELERY_IMPORTS来添加
CELERY_IMPORTS = [
'app01.taskName',
'app02.taskName'
]
# debug_task 例子是绑定了自己的request请求信息的一个任务函数。
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
然后,您需要将此proj/proj/__init__.py
模块导入模块中。这样可以确保在Django启动时加载该应用,以便@shared_task
装饰器(稍后提及)将使用该应用:
proj/proj/__init__.py
:
from __future__ import absolute_import, unicode_literals
# 这个操作是为了确保在django启动时启动celery
from .celery import app as celery_app
__all__ = ('celery_app',)
请注意,此示例项目布局适用于大型项目,对于简单项目,您可以使用一个包含的模块来定义应用程序和任务,例如“ Celery的第一步”教程。
让我们分解一下第一个模块中发生的情况,首先我们从将来导入绝对导入,这样我们的 celery.py
模块就不会与库冲突:
from __future__ import absolute_import
然后我们设置默认 DJANGO_SETTINGS_MODULE
celery命令行程序的环境变量:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
您不需要此行,但是可以避免始终将设置模块传递到celery
程序中。它必须始终在创建应用程序实例之前出现,我们接下来要做的是:
app = Celery('proj')
这是我们的库实例,您可以有很多实例,但是使用Django时可能没有理由。
实例后更新配置的方法:
# 更新配置,配置中间人和结果存储
app.conf.update(
# 使用redis的库1作为消息队列
BROKER_URL="redis://127.0.0.1:6379/1",
# 使用项目数据库存储任务执行结果
CELERY_RESULT_BACKEND='django-db',
# 如过想把把结果存在redis的库2中这样配置:
# CELERY_RESULT_BACKEND = "redis://:123@127.0.0.1:6800/2",
)
我们还将Django设置模块添加为Celery的配置源。这意味着您不必使用多个配置文件,而直接从Django设置中配置Celery。但您也可以根据需要将它们分开。
app.config_from_object('django.conf:settings', namespace='CELERY')
大写命名空间意味着所有Celery配置选项必须以大写而不是小写指定,并以开头 CELERY_
,例如,task_always_eager
设置变为CELERY_TASK_ALWAYS_EAGER
,而broker_url
设置变为CELERY_BROKER_URL
。
您可以直接传递设置对象,但是使用字符串更好,因为那样一来,工作人员就不必序列化该对象。该CELERY_
命名空间也是可选的,但建议(以防止重叠与其他Django的设置)。
接下来,可重用应用程序的常见做法是在一个单独的tasks.py
模块中定义所有任务,而Celery确实可以自动发现这些模块:
app.autodiscover_tasks()
在tasks.py
约定的上方,Celery将自动按照惯例从所有已安装的应用程序发现任务:
- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py
这样,您不必手动将单个模块添加到CELERY_IMPORTS
设置中。
最后,该debug_task
示例是一个转储其自己的请求信息的任务。这是使用bind=True
Celery 3.1中引入的新任务选项轻松地引用当前任务实例。
使用@shared_task
装饰
您编写的任务可能会存在于可重用应用程序中,并且可重用应用程序不能依赖于项目本身,因此您也不能直接导入应用程序实例。
该@shared_task
装饰可以让你无需任何具体的应用程序实例创建任务:
demoapp/tasks.py
:
# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
也可以看看
您可以在以下位置找到Django示例项目的完整源代码:https : //github.com/celery/celery/tree/master/examples/django/
相对导入
您必须在导入任务模块的方式上保持一致。例如,如果您在project.app
中INSTALLED_APPS
,则还必须导入任务,否则任务的名称最终将不同。from project.app
请参阅自动命名和相对导入
django-celery-results
使用Django ORM / Cache作为结果后端
所述的django-芹菜-结果扩展使用任一Django的ORM,或Django的缓存框架提供结果后端。
要将其用于您的项目,您需要执行以下步骤:
-
$ pip install django-celery-results
-
添加
django_celery_results
到INSTALLED_APPS
您的Django项目的中settings.py
:INSTALLED_APPS = ( ..., 'django_celery_results', )
请注意,模块名称中没有短划线,只有下划线。
-
通过执行数据库迁移来创建Celery数据库表:
$ python manage.py migrate celery_results
-
配置Celery以使用django-celery-results后端。
假设您还使用Django
settings.py
来配置Celery,请添加以下设置:CELERY_RESULT_BACKEND = 'django-db'
对于缓存后端,您可以使用:
CELERY_CACHE_BACKEND = 'django-cache'
django-celery-beat
具有管理界面的数据库支持的定期任务。
可以在命令行(--scheduler
参数)上指定自定义调度程序类 。
默认调度程序是celery.beat.PersistentScheduler
,它仅跟踪本地shelve
数据库文件中的最后运行时间。
还有django-celery-beat扩展,可将日程表存储在Django数据库中,并提供一个方便的管理界面来在运行时管理定期任务。
要安装和使用此扩展:
-
使用pip安装软件包:
$ pip install django-celery-beat
-
将
django_celery_beat
模块添加到INSTALLED_APPS
Django项目中settings.py
:INSTALLED_APPS = ( ..., 'django_celery_beat', )
请注意,模块名称中没有短划线,只有下划线。
-
应用Django数据库迁移,以便创建必要的表:
$ python manage.py migrate
-
使用调度程序启动芹菜节拍服务
django_celery_beat.schedulers:DatabaseScheduler
:$ celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
注意:您也可以直接将其添加为设置选项。
-
访问Django-Admin界面以设置一些定期任务。
启动工作进程
在生产环境中,你会想要在后台作为守护程序运行工人-看到系统守护进程 -但对于测试和开发能够通过使用来启动一个工人实例它是有用的 芹菜工人 manage命令,就像你” d使用Django的 manage.py runserver:
$ celery -A proj worker -l info
有关可用命令行选项的完整列表,请使用help命令:
$ celery help
Django-celery模块
django-celery是django中的celery集成模块
Django-celery3.3.1,仅当你要使用DJANGO结果后端和管理集成时才需要此项目。
django-celery为Django提供Celery集成;使用Django ORM和缓存后端存储结果,自动发现INSTALLED_APPS中
列出的应用程序的任务模块,等等。
使用django-celery
要为您的项目启用django-celery
,您需要将djcelery
添加到 INSTALLED_APPS
:
INSTALLED_APPS + =(“ djcelery”,)
然后将以下几行添加到您的settings.py中
:
import djcelery
djcelery.setup_loader()
除了需要通过manage.py
调用程序外,所有操作均与celery在Django中的使用方法相同。
celery中使用命令 | 在django-celery集成中对应如下命令 |
---|---|
celery | python manage.py celery |
celery worker | python manage.py celery worker |
celery beat | python manage.py celery beat |
celery ... | python manage.py celery ... |
另一个主要的区别是,参数配置值存储在Django项目的settings中,而不是在celeryconfig.py中。
安装使用
你可以通过源码安装,或者通过pip命令
$ pip install django-celery
或者通过 easy_install
安装,:
$ easy_install django-celery
然后你需要创建一些必要的表格. 如果你产生了一些迁移,使用如下命令
$ python manage.py migrate djcelery