---------------------------------------------
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