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解析最简单的验证码
Jan 07 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
通过实例学习Python Excel操作
Jan 06 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
学习python需要有编程基础吗
Jun 02 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
pytorch 使用半精度模型部署的操作
May 24 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
python单向链表实例详解
May 25 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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绑定跨框架菜单(For IE)
2007/01/27 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
es6函数之尾递归用法实例分析
2020/04/25 Javascript
Python实时获取cmd的输出
2015/12/13 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Python装饰器用法示例小结
2018/02/11 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python实现大学人员管理系统
2019/10/25 Python
python适合做数据挖掘吗
2020/06/16 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
公务员职务工作的自我评价
2013/11/01 职场文书
任课老师推荐信范文
2013/11/24 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
入党自荐书范文
2014/03/09 职场文书
英语教育专业自荐信
2014/05/29 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
浅谈Python 中的复数问题
2021/05/19 Python