时间:2021-05-22
背景
在开发中,我们常常会遇到一些耗时任务,举个例子:
上传并解析一个 1w 条数据的 Excel 文件,最后持久化至数据库。
在我的程序中,这个任务耗时大约 6s,对于用户来说,6s 的等待已经是个灾难了。
比较好的处理方式是:
我们按照这个思路,借助 Celery 进行实现。
实现
本文所使用的环境如下:
使用 Docker 安装 RabbitMQ
Celery 依赖一个消息后端,可选方案有 RabbitMQ, Redis 等,本文选用 RabbitMQ 。
同时为了安装方便,RabbitMQ 我直接使用 Docker 安装:
启动成功后,即可通过 amqp://localhost 访问该消息队列。
安装并配置 Celery
Celery 是 Python 实现的工具,安装可以直接通过 Pip 完成:
同时假设当前我的项目文件夹为 proj ,项目名为 myproj ,应用名为 myapp
安装完成后,在 proj/myproj/ 路径下创建一个 celery.py 文件,用来初始化 Celery 实例:
proj/myproj/celery.py
然后在 proj/myproj/__init__.py 中添加对 Celery 对象的引用,确保 Django 启动后能够初始化 Celery:
proj/myproj/__init__.py
无其他特殊配置的话,Celery 的基本配置就是这些。
编写一个耗时任务
为了模拟一个耗时任务,我们直接创建一个方法,使其「睡」10s ,并将其设置为 Celery 的任务:
proj/myapp/tasks.py
启动 Celery Worker
Celery 配置完成,并且任务创建成功后,我们以异步任务的模式启动 Celery :
注意到我强调了异步模式,是因为 Celery 除了支持异步任务,还支持定时任务,因此启动时候要指明。
同时要注意,Celery 一旦启动,对 Task(此处为 waste_time) 的修改必须重启 Celery 才会生效。
任务调用
在请求处理的逻辑代码中,调用上面创建好的任务:
proj/myapp/views.py
调用 waste_time.delay() 方法后, waste_time 会被加入到任务队列中,等待空闲的 Celery Worker 调用。
效果
当我们发送请求时,这个接口会直接返回 {"results": "操作成功,正在上传,请稍候..."} 的响应内容而非卡住十秒,用户体验要好许多。
总结
用 Celery 处理这种异步任务是 Python 常用的方法,虽然实际执行成功耗时不变甚至有所增加(如 Worker 繁忙导致处理滞后),但是对于用户体验来说更容易接受,点击上传大文件后可以继续处理其他事务,而不需要在页面等待。
Celery 还有更多用法本文未介绍到,其文档已经非常详尽,有需要可直接参考。
参考
http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
https://hub.docker.com/_/rabbitmq
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
起步在《分布式任务队列Celery使用说明》中介绍了在Python中使用Celery来实验异步任务和定时任务功能。本文介绍如何在Django中使用Celery。
celery简介celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Even
1.简介celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的
所有演示均基于Django2.0celery是一个基于python开发的简单、灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上
Celery(芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。架构设计Celery的架构由三部分组