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描述器descriptor详解
Feb 03 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
Python读取实时数据流示例
Dec 02 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
Python爬虫requests库多种用法实例
May 28 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
Python列表元素删除和remove()方法详解
Jan 04 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
使用python脚本实现查询火车票工具
2018/07/19 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python的slice notation的特殊用法详解
2019/12/27 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
Python实现爬取并分析电商评论
2020/06/19 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
师范应届毕业生自荐信
2013/11/18 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
中班中秋节活动反思
2014/02/18 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
生物技术专业求职信
2014/06/10 职场文书
服务行业标语口号
2015/12/26 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS