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 24 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
python实现移位加密和解密
Mar 22 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
Python搭建HTTP服务过程图解
Dec 14 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
python如何查看网页代码
Jun 07 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 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
phpmyadmin的#1251问题
2006/11/25 PHP
php cli配置文件问题分析
2015/10/15 PHP
php无限级分类实现方法分析
2016/10/19 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
php-app开发接口加密详解
2018/04/18 PHP
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
python使用scrapy解析js示例
2014/01/23 Python
Python实现测试磁盘性能的方法
2015/03/12 Python
python比较两个列表大小的方法
2015/07/11 Python
python实现抽奖小程序
2020/04/15 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
python os.rename实例用法详解
2020/12/06 Python
python绘制汉诺塔
2021/03/01 Python
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
采购经理岗位职责
2014/02/16 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
科技工作者先进事迹
2014/08/16 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
Python进行区间取值案例讲解
2021/08/02 Python
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android