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读写excel的方法
Nov 18 Python
python计算对角线有理函数插值的方法
May 07 Python
初步剖析C语言编程中的结构体
Jan 16 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python实现简易Web爬虫详解
Jan 03 Python
python绘制多个曲线的折线图
Mar 23 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
python web框架中实现原生分页
Sep 08 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
Python基础之函数嵌套知识总结
May 23 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
Python多层装饰器用法实例分析
2018/02/09 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
物业管理求职自荐信
2013/09/25 职场文书
食品营养与检测应届生求职信
2013/11/08 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
关于读书的演讲稿
2014/05/07 职场文书
小学生植树节活动总结
2014/07/04 职场文书
道路施工安全责任书
2014/07/24 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
英语导游词
2015/02/13 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Python如何识别银行卡卡号?
2021/06/10 Python
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js