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中线程编程之threading模块的使用详解
Jun 23 Python
Python多线程下载文件的方法
Jul 10 Python
Python中的默认参数实例分析
Jan 29 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python Requests库基本用法示例
Aug 20 Python
在Python中获取操作系统的进程信息
Aug 27 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
Python SSL证书验证问题解决方案
Jan 13 Python
Python通过文本和图片生成词云图
May 21 Python
Python Dataframe常见索引方式详解
May 27 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Python代码风格与编程习惯重要吗?
Jun 03 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的加密方式及原理
2012/06/14 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
创建nuxt.js项目流程图解
2020/03/13 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python中的time模块与datetime模块用法总结
2016/06/30 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python温度转换实例分析
2018/01/17 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python set集合使用方法解析
2019/11/05 Python
Python项目打包成二进制的方法
2020/12/30 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
信用社实习人员自我鉴定
2013/09/20 职场文书
电子信息毕业生自荐信
2013/11/16 职场文书
大学生实习自我鉴定
2013/12/11 职场文书
办理居住证介绍信
2014/01/15 职场文书
企业总经理职责
2014/02/02 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2015年采购员工作总结
2015/04/27 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
Python 数据可视化之Bokeh详解
2021/11/02 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
python画条形图的具体代码
2022/04/20 Python
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript