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实现simhash算法实例
Apr 25 Python
Python查看多台服务器进程的脚本分享
Jun 11 Python
跟老齐学Python之开始真正编程
Sep 12 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
剖析Python的Twisted框架的核心特性
May 25 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
Python实现Kmeans聚类算法
Jun 10 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
Apr 25 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
使用python-pptx包批量修改ppt格式的实现
Feb 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
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
php+mysql事务rollback&commit示例
2010/02/08 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php中autoload的用法总结
2013/11/08 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
Django发送html邮件的方法
2015/05/26 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
优秀求职信范文分享
2013/12/19 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
五水共治一句话承诺
2014/05/30 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
2016年十一促销广告语
2016/01/28 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电
python APScheduler执行定时任务介绍
2022/04/19 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis