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中使用Boolean操作符做真值测试实例
Jan 30 Python
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
python清除字符串里非字母字符的方法
Jul 02 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python实现图片转字符画的代码实例
Feb 22 Python
python如何实现视频转代码视频
Jun 17 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
快速了解Python开发环境Spyder
Jun 29 Python
python 装饰器的使用示例
Oct 10 Python
详解python中的异常和文件读写
Jan 03 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
js实现车辆管理系统
2020/08/26 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
Python类定义和类继承详解
2015/05/08 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
值传递还是引用传递
2015/02/08 面试题
保洁主管岗位职责
2013/11/20 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
DSP接收机前端设想
2022/04/05 无线电