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标准库与第三方库详解
Jul 22 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python算术运算符实例详解
May 31 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Python中GIL的使用详解
Oct 03 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
PyQt5实现简易电子词典
Jun 25 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
解决Django连接db遇到的问题
Aug 29 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python创建n行m列数组示例
2019/12/02 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
Django实现简单的分页功能
2021/02/22 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
中专生自我鉴定
2013/12/17 职场文书
供电工程专业求职信
2014/08/09 职场文书
2015年教研员工作总结
2015/05/26 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL