---------------------------------------------
Django 第一步

Django使用Celery

注意:

Celery 之前的版本需要一个单独的库和Django一起工作

但是自从3.1版本开始 这个不是这样了。 Django 是被完美支持 因此这个文档只包含了基本的方式来整合Celery和Django

你会使用相同的API作为非Django用户

>>> import django
>>> print django.__version__
1.11.9

>>> print celery.__version__
3.1.26.post2


Celery 4.0 是支持Django 1.8 和更新的版本

使用Celery 3.1 比Django 1.8 更老本的版本

node2:/scan/picha#pip install --upgrade celery

>>> print celery.__version__
4.2.1
>>> import django
>>> print django.__version__
1.11.9

使用Celery 在你的Django 项目 你必须首选定义一个Celery 库实例(称为一个app)

如果你有一个Django项目如下:

- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py

然后推荐的方式是创建一个 proj/proj/celery.py 模块定义Celery 实例:


file: proj/proj/celery.py
node2:/scan#vim picha/picha/celery.py

#! /usr/bin/env python
# coding: utf-8

然后 你需要导入这个app 在你的proj/proj/__init__.py 模块

这个确保 app是被加载当 Django 启动这样@shared_task 装饰器会被使用

proj/proj/__init__.py:

node2:/scan#cat picha/picha/__init__.py
from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)
node2:/scan#

注意 这个例子项目是适合于大型项目的,对于简单的项目 你可能使用一个简单的包含模块定义app和tasks

让我们分解下 第一个模块发生了什么,首先 我们从future 绝对导入 ,这样我们的celery.py 模块不会和其他模块冲突

from __future__ import absolute_import

然后我们设置 DJANGO_SETTINGS_MODULE 环境变量用于celery 命令行程序

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

你不需要这样,但他可以避免传递设置模块到celery 程序

app = Celery('proj')

这是我们库的实例,你可以有多个实例

我们也增加Django 设置模块作为配置源 用于Celery

这个意味着你不需要使用多个配置文件

app.config_from_object('django.conf:settings', namespace='CELERY')


接下来,一个常见的实践是重用apps来定义所有的tasks 到一个单独的tasks.py 模块

Celery 有一个方式来自动发现那些模块

app.autodiscover_tasks()



上面行Celery 会自动发现takss从所有你安装的应用,

node2:/scan/picha#tree demo
demo
├── admin.py
├── admin.pyc
├── apps.py
├── __init__.py
├── __init__.pyc
├── migrations
│ ├── __init__.py
│ └── __init__.pyc
├── models.py
├── models.pyc
├── tasks.py
├── tests.py
└── views.py

1 directory, 12 files

这种方式你不需要手动增加单个模块到CELERY_IMPORTS设置:

最后,debug_task 例子是一个任务dumps它自己的请求信息。

这是使用 new bind=True 任务选项介绍在Celery 3.1中

Using the @shared_task decorator

使用 @shared_task 装饰器:


tasks 你写的可能存在重用的apps, 重用apps 不能依赖项目本身 ,

因此你不能直接导入你的app

@shared_task 装饰器 让你创建任务不需要有任何应用程序实例:

扩展:

django-celery-results - 使用Django ORM/Cache 作为一个结果后端:

django-celery-results 扩展提供结果后端使用 Django ORM,或者Djago Cache 框架

1. 使用这个项目 你需要遵循如下步骤:

1.Install the django-celery-results library:

请注意 这里没有破折号 在模块名字里,只能下划线:

Create the Celery database tables by performing a database migrations:

创建celery 数据库表通过执行一个数据库迁移:

node2:/scan/picha#python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, celery_results, contenttypes, djcelery, sessions
Running migrations:
No migrations to apply.
node2:/scan/picha#

Starting the worker process

如果一个生产环境 你需要运行worker 在后台作为一个daemon

但是对于testing和开发 它是可以启动一个worker 实例通过

使用celery worker manage 命令


node2:/scan/picha#ls
demo manage.py picha
node2:/scan/picha#celery -A picha worker -l info