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进程类subprocess的一些操作方法例子
Nov 22 Python
Python实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
python实现端口转发器的方法
Mar 13 Python
低版本中Python除法运算小技巧
Apr 05 Python
Python入门教程之if语句的用法
May 14 Python
python通过socket查询whois的方法
Jul 18 Python
Python应用领域和就业形势分析总结
May 14 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
如何解决安装python3.6.1失败
Jul 01 Python
python如何快速拼接字符串
Oct 28 Python
使用python绘制横竖条形图
Apr 21 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
书法比赛获奖感言
2014/02/10 职场文书
建筑工地宣传标语
2014/06/18 职场文书
争先创优演讲稿
2014/09/15 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
杭白菊导游词
2015/02/10 职场文书
教师求职自荐信
2015/03/26 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python