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通过cookie模拟已登录状态的初步研究
Nov 09 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python如何生成各种随机分布图
Aug 27 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 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中的Streams详细介绍
2014/11/12 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Python深入06——python的内存管理详解
2016/12/07 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python实现五子棋人机对战游戏
2020/03/25 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python logging 日志的级别调整方式
2020/02/21 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
经典大学生求职信范文
2014/01/06 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
北京大学自荐信范文
2014/01/28 职场文书
导游实习生自荐书
2014/01/28 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle