http通过StreamingHttpResponse完成连续的数据传输长链接方式

 更新时间:2022年02月12日 09:29:34   作者:Hayley-L  
这篇文章主要介绍了http通过StreamingHttpResponse完成连续的数据传输长链接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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的过程中,所以这有可能会降低服务器的性能。

参考文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Sentry的安装、配置、使用教程(Sentry日志手机系统)

    Sentry的安装、配置、使用教程(Sentry日志手机系统)

    Sentry 是一个实时事件日志记录和聚合平台,由于ExceptionLess官方提供的客户端只有.Net/.NetCore平台和js的,本文继续介绍另一个日志收集系统Sentry,感兴趣的朋友一起看看吧
    2022-07-07
  • python爬虫MeterSphere平台执行报告流程解析

    python爬虫MeterSphere平台执行报告流程解析

    这篇文章主要为大家介绍了python爬虫MeterSphere平台执行报告流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 解决python3捕获cx_oracle抛出的异常错误问题

    解决python3捕获cx_oracle抛出的异常错误问题

    今天小编就为大家分享一篇解决python3捕获cx_oracle抛出的异常错误问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • pytest中fixture函数使用

    pytest中fixture函数使用

    本文主要介绍了pytest中fixture函数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python实现公司年会抽奖程序

    python实现公司年会抽奖程序

    这篇文章主要为大家详细介绍了python实现公司年会抽奖程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Python OpenCV实现图像傅里叶变换

    Python OpenCV实现图像傅里叶变换

    傅里叶变换,也称作傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。本文将介绍如何通过OpenCV实现图像的傅里叶变换,需要的可以参考一下
    2022-01-01
  • openCV入门学习基础教程第二篇

    openCV入门学习基础教程第二篇

    人脸识别,物体检测,OpenCV是基石,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 对Python中Iterator和Iterable的区别详解

    对Python中Iterator和Iterable的区别详解

    今天小编就为大家分享一篇对Python中Iterator和Iterable的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python JSON模块的使用详情

    Python JSON模块的使用详情

    这篇文章主要介绍了Python JSON模块的使用详情,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写下面文章围绕Python JSON模块的相关资料展开内容,需要的小伙伴可以参考一下,希望 对你有所帮助
    2021-12-12
  • python实现百度文库自动化爬取

    python实现百度文库自动化爬取

    项目是合法项目,只是进行数据解析而已,不能下载看不到的内容.部分文档在电脑端不能预览,但是在手机端可以预览,所有本项目把浏览器浏览格式改成手机端,支持Windows和Ubuntu. 本项目使用的是chromedriver来控制chrome来模拟人来操作来进行文档爬取
    2021-04-04

最新评论