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 11 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
基于FME使用Python过程图解
May 13 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
基于Python实现nc批量转tif格式
Aug 14 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
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
Vue指令指令大全
2019/02/09 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
校长先进事迹材料
2014/02/01 职场文书
个人借款担保书
2014/04/02 职场文书
倡议书格式范文
2014/04/14 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python