作者简介

211工程院校贵州大学管理学院硕士研究生、互联网金融行业资深DevOps研发工程师. 曾在国内多家知名互联网公司 平安科技、微众银行、顺丰科技、魅族任职. 具有多年国内一线互联网公司自动化运维平台设计与开发经验。
前言:
你开发了一个WEB API接受用户的调用,API通过接收客户端传过来的参数来执行一些耗时操作,如调用smtp模块或者sms模块来发送邮件或短信。若本次http请求是同步的,整个请求的流程如下:
客户端request -> urls.py -> views.py -> function(耗时任务) ->response客户端
如果耗时任务需要很长时间才能执行,API的响应时间约等于耗时任务所需要的时间,那么此时客户端的本次请求将会被卡住等待Http服务器响应。为了解决这个问题,需要对API进行异步改造,本文讨论如何将Celery与Django相结合实现异步API。
基本概念:
同步请求: 调用一旦开始,必须等待当前请求被响应后才可以继续后续行为
异步请求: 调用一旦开始,不需要等待当前请求被响应也可以继续后续行为
下面我们通过一个生活中的场景生动描述同步与异步,对这一概念的掌握将对追女大有助力。公司有两个妹子小红、小花均属于肤白人美大长腿人见人爱型。被IT部踏实本分IT男张三和设计部浮夸花心李四同时追求。
已知:
1. 妹子小红、小花响应是否同意交往的时间周期是2天
2. 张三李四的共同点是两个妹子都喜欢,随便追到哪个都行 不挑人
3. 张三李四表白后最多能追到1个或两个都追不到
张三的追女方式:
day1:张三表白小红 --> 小红说考虑2天给答复
day2: 张三等待小红答复
day3:小红答复不愿意
张三白等两天
day3: 张三继续表白小花 --> 小花说考虑2天
day4: 张三等待小花答复
day5:小花同意或不同意
综上: 张三采用同步的方式等待妹子答复,最终无论是否追妹成功,耗费的时间成本是4天
李四的追女方式:
day1: 李四表白小红 --> 小红说考虑2天给答复
day1: 李四表白小花 --> 小花说考虑2天给答复
day2: 李四等待小红和小花答复
day3: 小红和小花中会有一人同意或2人都不同意
综上: 李四采用异步的方式等待妹子答复,最终无论是否追妹成功,耗费的时间成本是2天
可见把编代码中通过异步方式实现并发用到生活中的追女场景中,无论成功与否都可以大幅节约时间,这也是为啥渣男&绿茶婊喜欢发展备胎的原因吧!
2.1 安装celery、django-celery相关包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-celery
注:安装包的版本并不是越新越好,安装过新的版本可能出现兼容性问题导致报错。
(workplace) [root@backup-platform python]# pip freeze | grep celery
celery==3.1.26.post2
django-celery==3.3.1
2.2 开始配置django-celery项目
2.2.1 在django的settings.py配置文件夹添加以下内容

代码说明:创建Celery对象实例,并将djcelery注册到INSTALL_APPS中
2.2.2 在Django app目录下创建tasks.py添加异步任务执行函数

代码说明:
函数f1是一个耗时任务,本例中消耗10s的时间才能计算出结果,通过app.task装饰后,该函数变成了一个可通过celery执行的异步任务.
2.2.3 在视图函数views.py中添加异步任务调用

代码说明:
视图函数中的f1.delay()将异步任务函数f1添加至消息队列并被worker执行
注: 当get请求到达视图函数celery_index时,将会执行celery异步任务tasks.py模块中的函数f1。
2.2.4 在urls.py中添加路由与视图函数间的映射

代码说明:
定义urls.py中的路由与视图函数之间的映射关系,URL:index与视图函数celery_index相关联.
2.2.5 启动项目
#启动celery worker
(workplace) [root@backup-platform celery_web]# python manage.py celery worker --loglevel=info
#启动django项目
(workplace) [root@backup-platform celery_web]# python manage.py runserver 0.0.0.0:8902
2.2.6 请求url并测试异步任务
在celery窗口中查看日志输出如下:

2
结束语






