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中的Cookie模块使用
Jul 06 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
python 排序算法总结及实例详解
Sep 28 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
Python中创建二维数组
Oct 17 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Python常用特殊方法实例总结
Mar 22 Python
Django 表单模型选择框如何使用分组
May 16 Python
Python 图片添加美颜效果
Apr 28 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
PHP下10件你也许并不了解的事情
2008/09/11 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python格式化日期时间操作示例
2018/06/28 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
为什么说python适合写爬虫
2020/06/11 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
大学生两会精神学习心得体会
2014/03/10 职场文书
消防安全责任书范本
2014/04/15 职场文书
五水共治一句话承诺
2014/05/30 职场文书
农业项目建议书
2014/08/25 职场文书
2015年行政部工作总结
2015/04/28 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers