有时候我们 Django 的视图中会有一些执行比较耗时的任务(例如收发邮件) 和 后台任务(例如爬虫和更新服务器缓存).
Celery 是 Python 开发分布式任务列队的处理库. 可以异步分布式地异步处理任务, 也可定时执行任务等等.下面介绍一个 Celery的简单案例.
Celery 方式的选择.
这里 Celery 的中间人, 我采用 Redis. 安装 Redis.
这里还需要安装 celery-with-redis --> pip install celery-with-redis.
该命令会自动安装 redis(python库)、celery、kombu、billiard、amqp、vine和celery-with-redis相关库. 这里安装的 redis 是 python 操作 redis 的库, 非 redis 库. redis 数据库需要独立安装.
为了测试, views.py 写了一个耗时方法, 和一个响应 json 方法.

编写对应路由访问 index 视图 看一下响应速度. 中间有个10秒等待.
注: 这边 Student.objects.values() 得到的是一个类字典查询集类, 你要把他转化成字典列表才能进行 json.dumps() 操作进而转化成字符串在浏览器格式化输出.
下面的 celery 版本是 3.1.25 celery 4.x可能不同.
打开 settings.py 所在文件夹, 新建 celery.py 文件.

这个文件还没被加载, 接着打开 settings.py 同目录下的 __init__.py 文件. 让运行该 Django 项目的时候, 加载改文件配置 Celery.

还需在 settings.py 中设置 celery, 尤其是中间人的设置. 若不设置中间人,会提示无法连接中间人的错误.

把耗时任务丢给 celery 去处理.
上面的 views.py 有个耗时任务 send. 在 myapp 应用下新建 task.py 文件, 将 send 方法剪切到该文件中并定义为 celery 任务.

在原有的方法上加上 celery 装饰器 task. 也可以通过前面添加的 celery_app 给 send 方法加装饰器。 (views.py 文件中)

原来的 index 视图函数修改为:

本地启动 celery 并测试.
启动 celery 之前, 确保已经安装 redis 并启动 redis 服务.
redis 安装过程 : --> http://yshblog.com/blog/155
接着, 启动 celery worker. 这个 worker 是用于异步执行任务的 "工作者". 进去 manage.py 文件所在目录, 执行如下命令:
Celery -A myproject(项目名) worker -l(英文字母L的小写) info
在启动 Django 服务器 python manage.py runserver 看一下响应时间.
网友评论