django - celery 的集成开发
celery 特点
- celery 简单、灵活、可靠的分布式系统
- 处理异步任务队列
- 支持任务调度
celery 的组成
- 消息中间件
- 任务执行单元 worker
- 任务结果存储 task store
在 django 中使用 celery
1、安装
pip install django-celery
pip install celery-with-redis
pip install eventlet
pip install --upgrade https://github.com/celery/celery/tarball/master
2、在 settings.py
中 配置 celery 相关的配置
CELERY_BROKER_URL = redis://127.0.0.1:6379/6
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = redis://127.0.0.1:6379/7
ELERY_TASK_SERIALIZER = 'json'
3、在 settings.py
配置文件所在的包下,新建一个 celerys.py
from celery import Celery
import os
# 引入django的环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'taobao.settings')
# 创建一个 Celery 对象
app = Celery("taobao")
# 从 settings.py 中读取 CELERY_ 开头的所有配置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动发现任务(会从 INSTALLAPP_DIRS 下的所有应用中,找 tasks.py 文件)
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
4、在 settings.py
所在的包下的 __init__.py
模板中,导入 app
from .celerys import app as celery_app
__all__ = ('celery_app',)
5、在应用下新建 user/tasks.py
from django.core.mail import EmailMessage
from celery import app
@app.shared_task
def send_mail(subject, body, to, subtype="html"):
message = EmailMessage(subject=subject, body=body, to=to)
message.content_subtype = subtype
message.send()
6、在 views.py
中,调用任务
from user.tasks import send_mail
def send_email() :
....
send_mail.delay(subject, body ,to)
...
retrun ....
7、启动 celery 服务
celery -A 项目名 worker -l info -P eventlet