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的collections模块中的OrderedDict有序字典
Jul 07 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
Python TestCase中的断言方法介绍
May 02 Python
python数据挖掘需要学的内容
Jun 23 Python
在django view中给form传入参数的例子
Jul 19 Python
python3安装crypto出错及解决方法
Jul 30 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
keras 如何保存最佳的训练模型
May 25 Python
浅析NumPy 切片和索引
Sep 02 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 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
php mail to 配置详解
2014/01/16 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
写的htc的数据表格
2007/01/20 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Python实现图像几何变换
2015/07/06 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
sklearn的predict_proba使用说明
2020/06/28 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
应届生污水处理求职信
2013/11/06 职场文书
文员岗位职责
2013/11/09 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
药品营销策划方案
2014/06/15 职场文书
办公用房租赁协议书
2014/11/29 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
php png失真的原因及解决办法
2021/10/24 PHP