http通过StreamingHttpResponse完成连续的数据传输长链接方式


Posted in Python onFebruary 12, 2022

http通过StreamingHttpResponse完成连续的数据传输长链接

问题

http服务之间传递结果流

一个由flask封装起来的算法,一个由django封装的后台,我希望在django里通过requests调用flask的算法接口,flask可以分析一帧返回一帧结果,追求分析结果的实时返回,而不是完全分析完再完整返回结果

为了能完整返回结果,暂时想到的模式有以下三种:

  • 一问一答:等待完整的分析结果,然后返回,最不济就用这种
  • 我要你给(长链接):flask返回一个generator,django取next就得到下一个的结果
  • 你有你给(理想,长链接):建立长链接,flask每分析出一帧结果,就返回

一次结果,直到分析结束,关闭连接

看到flask中有个flask_socketio建立socket连接,还没有实验

暂时用StreamingHttpResponse,generater能实现实时分析的感觉,属于第三种模式(你有你给)

django的StreamingHttpResponse可以返回generater,request调用返回generate的接口的时候,通过contextlib 的closing对流进行处理:

输出

#django 算法端,输出流
from django.http import StreamingHttpResponse
def stream_response(request):                  
    def generate():                            
        for i in range(10):                    
            print(i)                           
            yield 'hi ' + str(i)               
            print('sleep 3')                   
            time.sleep(1)                      
    return StreamingHttpResponse(generate(), ) 
#flask 算法端,输出流
@app.route('/re', methods=('POST', ))
def re():
    @flask.stream_with_context
    def generate():
        for i in range(10):                    
            print(i)                           
            yield 'hi ' + str(i)
            print('sleep 3')                   
            time.sleep(1)
    return flask.Response(generate())

输入

不区分flask,django,都可以通过request,contextlib 实现

#flask 算法端
@app.route('/test', methods=['POST', 'GET'])
def test():
    url = 'http://172.16.68.151:8000/test2'
    from contextlib import closing
    with closing(requests.get(url, stream=True)) as r1:
        for i in r1.iter_content():
            print(i)

StreamingHttpResponse和HttpResponse

在修改以前的文件下载功能时,发现一个文件有5G,用HttpResponse实现时,服务器返回502错误,查看nginx log时,发现nginx log记录的是: upstream prematurely closed connection while reading response header from upstream。应该是nginx服务器从上游获取数据时超时了。

查了很多办法,修改了nginx的配置,但是仍然超时。

绝望之下,查了一下Django的文档,发现了StreamingHttpResponse,试了一下效率提高了很多。

后来仔细查了一下发现HttpResponse在使用文件迭代器时:

HttpResponse will consume the iterator immediately, store its content as a string, and discard it.

HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储城字符串,然后返回给客户端,同时释放内存。可以当文件变大看出这是一个非常耗费时间和内存的过程。

而StreamingHttpResponse是将文件内容进行流式传输,

StreamingHttpResponse在官方文档的解释是:

The StreamingHttpResponse class is used to stream a response from Django to the browser. You might want to do this if generating the response takes too long or uses too much memory.

这是一种非常省时省内存的方法。但是因为StreamingHttpResponse的文件传输过程持续在整个response的过程中,所以这有可能会降低服务器的性能。

参考文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
推荐下python/ironpython:从入门到精通
Oct 02 Python
windows下安装python paramiko模块的代码
Feb 10 Python
安装Python的教程-Windows
Jul 22 Python
实践Vim配置python开发环境
Jul 02 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
python字符串下标与切片及使用方法
Feb 13 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
Django Form常用功能及代码示例
Oct 13 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 #Python
python ConfigParser库的使用及遇到的坑
Feb 12 #Python
Python制作春联的示例代码
Jan 22 #Python
Python制作表白爱心合集
基于Python实现一个春节倒计时脚本
Jan 22 #Python
详解Python如何批量采集京东商品数据流程
Jan 22 #Python
用Python实现屏幕截图详解
Jan 22 #Python
You might like
用Flash图形化数据(一)
2006/10/09 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php关联数组快速排序的方法
2015/04/17 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
js禁止页面刷新与后退的方法
2015/06/08 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
python中pass语句用法实例分析
2015/04/30 Python
python动态网页批量爬取
2016/02/14 Python
Python实现计算最小编辑距离
2016/03/17 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python的Jenkins接口调用方式
2020/05/12 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
中餐厅经理岗位职责
2014/04/11 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
公司委托书格式范文
2014/10/09 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server