暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Django+Celery实现异步HTTP请求

稻壳编程 2020-05-22
974

作者简介

211工程院校贵州大学管理学院硕士研究生、互联网金融行业资深DevOps研发工程师. 曾在国内多家知名互联网公司 平安科技、微众银行、顺丰科技、魅族任职. 具有多年国内一线互联网公司自动化运维平台设计与开发经验。

前言:

你开发了一个WEB API接受用户的调用,API通过接收客户端传过来的参数来执行一些耗时操作,如调用smtp模块或者sms模块来发送邮件或短信。若本次http请求是同步的,整个请求的流程如下:

客户端request -> urls.py -> views.py -> function(耗时任务) ->response客户端

如果耗时任务需要很长时间才能执行,API的响应时间约等于耗时任务所需要的时间,那么此时客户端的本次请求将会被卡住等待Http服务器响应。为了解决这个问题,需要对API进行异步改造,本文讨论如何将Celery与Django相结合实现异步API。

 1 

生活中的例子

基本概念:

同步请求: 调用一旦开始,必须等待当前请求被响应后才可以继续后续行为

异步请求: 调用一旦开始,不需要等待当前请求被响应也可以继续后续行为

下面我们通过一个生活中的场景生动描述同步与异步,对这一概念的掌握将对追女大有助力。公司有两个妹子小红、小花均属于肤白人美大长腿人见人爱型。被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 

第一个django-celery项目

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 

结束语

如果本文可以对您的工作学习带来帮助,请扫描左侧赞赏码以资鼓励作者;文章勘误请扫描右侧二维码联系作者。


文章转载自稻壳编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论