Django 集成 Celery 到项目
本节将 celery 集成到 Django 项目中,实现异步任务处理和定时任务处理
Celery 工作流程
Celery 的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
消息中间件
Celery 本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ
任务执行单元
Worker 是 Celery 提供的任务执行的单元,worker 并发的运行在分布式的系统节点中。
任务结果存储
Task result store 用来存储 Worker 执行的任务的结果,Celery 支持以不同方式存储任务的结果,包括 AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache
在虚拟环境中安装:
查看集成到 Django 中的 celery 版本, pip freeze
celery3.1.26.post2 django-celery3.2.2 flower==0.9.2
启动 redis 服务, 端口假设为 6379
发现 pip 安装比较慢的情况
pip install pillow -i https://pypi.douban.com/simple
2、Django 中配置
(1)在主工程的配置文件settings.py 中应用注册表INSTALLED_APPS中加入 djcelery
(2) 在 settings.py 中加入 celery 配置信息
当 djcelery.setup_loader() 运行时,Celery 便会去查看 INSTALLD_APPS 下包含的所有 app目录中的 tasks.py 文件,找到标记为 task 的方法,将它们注册为 celery task
BROKER_URL:broker 是代理人,它负责分发任务给 worker 去执行。我使用的是 Redis 作为 broker
没有设置 CELERY_RESULT_BACKEND,默认没有配置,此时 Django 会使用默认的数据库(也是你指定的 orm 数据库)。
CELERY_IMPORTS:是导入目标任务文件
CELERYBEAT_SCHEDULER:使用了 django-celery 默认的数据库调度模型,任务执行周期都被存在默认指定的 orm 数据库中.
CELERYBEAT_SCHEDULE:设置定时的时间配置, 可以精确到秒,分钟,小时,天,周等。
(3)创建应用实例
在主工程目录添加 celery.py, 添加自动检索 django 工程tasks任务
vim artproject/celery.py
(4) 创建任务 tasks
每个任务本质上就是一个函数,在 tasks.py 中,写入你想要执行的函数即可。
在应用 art 中添加我们需要提供的异步服务和定时服务
vim art/tasks.py
上述我们把异步处理任务add和定时器任务 tsend_email 都放在了 tasks.py 中
(5)迁移生成 celery 需要的数据表
python manage.py migrate
此时数据库表结构多出了几个
3、启动服务,测试
我们可以采用 python manage.py help 发现多出了 celery 相关选项。
(1)启动 django celery 服务
启动服务:
python manage.py celery worker --loglevel=info
此时异步处理和定时处理服务都已经启动了
(2)web端接口触发异步任务处理
我们在web端加入一个入口,触发异步任务处理add函数
在应用art的urls.py 中加入如下对应关系
启动 web 服务,通过 url 传入的参数,通过 handler 的 add.delay(x, y) 计算并存入 mysql
http://127.0.0.1:8000/art/add?x=188&y=22
(4) 测试定时器,发送邮件
在终端输入 python manage.py celerybeat -l info
会自动触发每隔 30s 执行一次 tsend_email 定时器函数,发送邮件:
具体发送邮件服务程序见下面的第4节
4、邮件发送服务
项目中经常会有定时发送邮件的情形,比如发送数据报告,发送异常服务报告等。
可以编辑文件 art/utils/send_mail.py, 内容编辑如下:
至此,在 celery ui 界面可以看到两类,定时器处理和异步处理。
5、启动 flower 服务
python manager celery flower
案例
读书网站实现抢读功能
qd(request, id) :抢读视图函数
quereyQD(request,id) :查询抢读的视图函数
settings.py
在主工程目录添加 celery.py, 添加自动检索django工程tasks任务