http通过StreamingHttpResponse完成连续的数据传输长链接方式
作者:Hayley-L 发布时间:2023-06-04 03:33:45
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的过程中,所以这有可能会降低服务器的性能。
参考文档
来源:https://blog.csdn.net/weixin_33127753/article/details/86700114


猜你喜欢
- 网上大部分都是上传文件,于是个人参照网上一些博客的内容,写了一个把windows上目录上传到远程linux的一个小程序。下面是代码:clas
- 这年头,信息和获得信息的渠道越来越多。随着信息量的增大,先有了分类,又有了导航,再有了搜索,后面的发展还不得而知。在此只是根据平日的所看所想
- 要用ifnull,而不是isnullisnull是判断是否为null,返回值是1表示null或者0表示不为空ifnull等同于oracle的
- 带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这
- 实际工作经历中,免不了有时候需要连接数据库进行问题排查分析的场景,之前一直习惯通过 mysql -uxxx -hxxxx -P1234 ..
- 1. 安装Opencv包pip install opvencv-python2.实现代码:视频转为图片:import cv2cap=cv2.
- SQL SERVER数据存储的形式在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小
- 前言这篇文章将详细讲解开始图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。数学形态学(Mathematical Morphology)是一种
- 一、python批量查询练习通过接口批量查询该ip是否属于指定接口:import requestsimport jsonif __name_
- 利用Python将多份excel表格整理成一份表格,抛弃过去逐份打开复制粘贴的方式。直接附上代码:import xlrd import xl
- 1.left join 基本用法mysql left join 语句格式A LEFT JOIN B ON 条件表达式left join 是以
- function rss_locale_date ($fmt, $ts, $addTZOffset&
- 目录1.任务要求2.简单设计3.模块实现4.总结由于一些小原因,被迫开始了tkinter一次实战演练。在此做一些记录,总结以及给自己留一些轮
- 不知不觉已经在家两个月了,眼看马上春节就要来临了。满怀期待的写了一个新年倒计时的小工具!设置新年时间后都能够使用,打开软件后可以自动计算到新
- overflow:hidden 用在div上时很好用,但直接用在td上,好像没有任何效果。td中的文本过长时依然自动换了一行像下面这要设定一
- 如何处理DataFrame的inf值在用DataFrame计算变化率时,例如(今天-昨天) / 昨天恰好为(2-0) / 0时,这些结果数据
- 在my.cnf中设置了sql_mode='STRICT_TRANS_TABLES';却发现还是有非法数据的写入,比如无符号整
- 一、环境配置大多数人无法登录网页版,所以饶过它模拟电脑登录,这个模块一定记得安装:pip install itchat-uospip ins
- Spyder本来还用得好好的,能正常使用,后来再关闭打开时,出现下面的蜘蛛网界面后,就无法显示操作界面了:后来在网上搜索了多种方法,甚至还将
- 改变列的数据类型 [sql] ALTER TABLE visitor MODIFY nam VARCHAR(30); 追加新列 [sql]