Django
celery集合django使用
注意 以前版本的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库的实例(称为 "app")
如果您拥有当前主流的Django项目结构,例如:
1
- proj/
2
- manage.py
3
- proj/
4
- __init__.py
5
- settings.py
6
- urls.py
Copied!
那么建议的方法是创建一个新的proj/proj/celery.py模块,该模块定义Celery实例
file: proj/proj/celery.py
1
from __future__ import absolute_import, unicode_literals
2
import os
3
from celery import Celery
4
5
# set the default Django settings module for the 'celery' program.
6
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
7
8
app = Celery('proj')
9
10
# Using a string here means the worker doesn't have to serialize
11
# the configuration object to child processes.
12
# - namespace='CELERY' means all celery-related configuration keys
13
# should have a `CELERY_` prefix.
14
app.config_from_object('django.conf:settings', namespace='CELERY')
15
16
# Load task modules from all registered Django app configs.
17
app.autodiscover_tasks()
18
19
20
@app.task(bind=True)
21
def debug_task(self):
22
print('Request: {0!r}'.format(self.request))
Copied!
然后,需要将此程序导入到proj/proj/__ init__.py模块中。这样可以确保在Django启动时加载应用程序,以便@shared_task装饰器(稍后提及)将使用该应用程序:
file:proj/proj/__init__.py:
1
from __future__ import absolute_import, unicode_literals
2
3
# This will make sure the app is always imported when
4
# Django starts so that shared_task will use this app.
5
from .celery import app as celery_app
6
7
__all__ = ('celery_app',)
Copied!
请注意,此示例项目结构适用于较大的项目,对于简单项目,可以使用一个包含的模块来定义应用程序和任务,例如"使用Celery进行入门"教程。
让我们分解一下第一个模块中发生的情况,首先我们从__freture__导入absolute_import导入unicode_literals,以使我们的celery.py模块不会与库冲突:
1
from __future__ import absolute_import
Copied!
然后,为celery命令行程序设置默认的DJANGO_SETTINGS_MODULE环境变量:
1
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
Copied!
不需要此行,但可以避免始终将设置模块传递到celery程序中。它必须始终在创建应用程序实例之前出现,我们接下来要做的是:
1
app = Celery('proj')
Copied!
这是我们的库实例,可以有很多实例,但是使用Django时可能没有理由。 我们还将Django设置模块添加为Celery的配置源。这意味着不必使用多个配置文件,而直接从Django设置中配置Celery;但也可以根据需要将它们分开。
1
app.config_from_object('django.conf:settings', namespace='CELERY')
Copied!
大写名称空间意味着所有Celery配置选项必须以大写而不是小写指定,并以CELERY_开头,因此例如task_always_eager设置变为CELERY_TASK_ALWAYS_EAGERbroker_url设置变为CELERY_BROKER_URL
可以直接传递设置对象,但是使用字符串更好,因为这样一来,工作人员就不必序列化该对象。 CELERY_名称空间也是可选的,但建议使用(以防止与其他Django设置重叠)。
接下来,可重用应用程序的常见做法是在单独的task.py模块中定义所有任务,而Celery可以自动发现这些模块:
1
app.autodiscover_tasks()
Copied!
在上述行中,Celery将按照task.py约定自动发现所有已安装应用程序中的任务:
1
- app1/
2
- tasks.py
3
- models.py
4
- app2/
5
- tasks.py
6
- models.py
Copied!
这样,不必手动将各个模块添加到CELERY_IMPORTS设置中。 最后,debug_task示例是一个转储其自己的请求信息的任务。这是使用Celery 3.1中引入的新的bind = True任务选项来轻松引用当前任务实例。

使用@shared_task装饰器

编写的任务可能会存在于可重用应用程序中,并且可重用应用程序不能依赖于项目本身,因此不能直接导入应用程序实例。 @shared_task装饰器可让您创建任务而无需任何具体的应用程序实例: file: demoapp/tasks.py:
1
# Create your tasks here
2
from __future__ import absolute_import, unicode_literals
3
from celery import shared_task
4
5
6
@shared_task
7
def add(x, y):
8
return x + y
9
10
11
@shared_task
12
def mul(x, y):
13
return x * y
14
15
16
@shared_task
17
def xsum(numbers):
18
return sum(numbers)
Copied!
ps: 可以在以下位置找到Django示例项目的完整源代码: https://github.com/celery/celery/tree/master/examples/django/
相对倒入 必须在导入任务模块的方式上保持一致。例如,如果您在INSTALLED_APPS中有project.app,则还必须从project.app中导入任务,否则任务的名称最终将不同。 Automatic naming and relative imports
扩展 django-celery-results - Using the Django ORM/Cache as a result backend django-celery-results扩展使用Django ORM或Django Cache框架提供results后端。
要在您的项目中使用此功能,您需要遵循以下步骤 1 Install the django-celery-results library:
1
$ pip install django-celery-results
Copied!
2 在Django项目的settings.py中将django_celery_results添加到INSTALLED_APPS:
1
INSTALLED_APPS = (
2
...,
3
'django_celery_results',
4
)
Copied!
3 通过执行数据库迁移来创建Celery数据库表:
1
$ python manage.py migrate celery_results
Copied!
4 配置Celery以使用django-celery-results后端。 假设您使用Django的settings.py来配置Celery,请添加以下设置:
1
CELERY_RESULT_BACKEND = 'django-db'
Copied!
对于缓存后端,可以使用:
1
CELERY_CACHE_BACKEND = 'django-cache'
Copied!
django-celery-beat - Database-backed Periodic Tasks with Admin interface.

启动Worker

在生产环境中,您需要在后台将守护进程作为守护程序运行-请参见守护进程-但对于测试和开发,能够使用celery worker manage命令启动一个守护程序实例非常有用,就像使用Django的manage.py runserver:
1
$ celery -A proj worker -l info
Copied!
有关可用的命令行选项的完整列表,请使用help命令:
1
$ celery help
Copied!
接下来看点啥 如果您想了解更多信息,请继续阅读“下一步”教程,然后您可以阅读《用户指南》
Last modified 1yr ago
Export as PDF
Copy link