網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
http通過(guò)StreamingHttpResponse完成連續(xù)的數(shù)據(jù)傳輸長(zhǎng)鏈接方式_python
作者:Hayley-L ? 更新時(shí)間: 2022-04-18 編程語(yǔ)言http通過(guò)StreamingHttpResponse完成連續(xù)的數(shù)據(jù)傳輸長(zhǎng)鏈接
問(wèn)題
http服務(wù)之間傳遞結(jié)果流
一個(gè)由flask封裝起來(lái)的算法,一個(gè)由django封裝的后臺(tái),我希望在django里通過(guò)requests調(diào)用flask的算法接口,flask可以分析一幀返回一幀結(jié)果,追求分析結(jié)果的實(shí)時(shí)返回,而不是完全分析完再完整返回結(jié)果
為了能完整返回結(jié)果,暫時(shí)想到的模式有以下三種:
- 一問(wèn)一答:等待完整的分析結(jié)果,然后返回,最不濟(jì)就用這種
- 我要你給(長(zhǎng)鏈接):flask返回一個(gè)generator,django取next就得到下一個(gè)的結(jié)果
- 你有你給(理想,長(zhǎng)鏈接):建立長(zhǎng)鏈接,flask每分析出一幀結(jié)果,就返回
一次結(jié)果,直到分析結(jié)束,關(guān)閉連接
看到flask中有個(gè)flask_socketio建立socket連接,還沒(méi)有實(shí)驗(yàn)
暫時(shí)用StreamingHttpResponse,generater能實(shí)現(xiàn)實(shí)時(shí)分析的感覺(jué),屬于第三種模式(你有你給)
django的StreamingHttpResponse可以返回generater,request調(diào)用返回generate的接口的時(shí)候,通過(guò)contextlib 的closing對(duì)流進(jìn)行處理:
輸出
#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())
輸入
不區(qū)分flask,django,都可以通過(guò)request,contextlib 實(shí)現(xiàn)
#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
在修改以前的文件下載功能時(shí),發(fā)現(xiàn)一個(gè)文件有5G,用HttpResponse實(shí)現(xiàn)時(shí),服務(wù)器返回502錯(cuò)誤,查看nginx log時(shí),發(fā)現(xiàn)nginx log記錄的是: upstream prematurely closed connection while reading response header from upstream。應(yīng)該是nginx服務(wù)器從上游獲取數(shù)據(jù)時(shí)超時(shí)了。
查了很多辦法,修改了nginx的配置,但是仍然超時(shí)。
絕望之下,查了一下Django的文檔,發(fā)現(xiàn)了StreamingHttpResponse,試了一下效率提高了很多。
后來(lái)仔細(xì)查了一下發(fā)現(xiàn)HttpResponse在使用文件迭代器時(shí):
HttpResponse will consume the iterator immediately, store its content as a string, and discard it.
HttpResponse會(huì)直接使用迭代器對(duì)象,將迭代器對(duì)象的內(nèi)容存儲(chǔ)城字符串,然后返回給客戶端,同時(shí)釋放內(nèi)存。可以當(dāng)文件變大看出這是一個(gè)非常耗費(fèi)時(shí)間和內(nèi)存的過(guò)程。
而StreamingHttpResponse是將文件內(nèi)容進(jìn)行流式傳輸,
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.
這是一種非常省時(shí)省內(nèi)存的方法。但是因?yàn)镾treamingHttpResponse的文件傳輸過(guò)程持續(xù)在整個(gè)response的過(guò)程中,所以這有可能會(huì)降低服務(wù)器的性能。
原文鏈接:https://blog.csdn.net/weixin_33127753/article/details/86700114
相關(guān)推薦
- 2023-01-20 python-try-except:pass的用法及說(shuō)明_python
- 2022-10-19 react-redux集中式狀態(tài)管理及基本使用與優(yōu)化_React
- 2023-04-29 C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊(duì)列的實(shí)現(xiàn)過(guò)程_C 語(yǔ)言
- 2022-11-23 .NET?SkiaSharp?生成二維碼驗(yàn)證碼及指定區(qū)域截取方法實(shí)現(xiàn)_實(shí)用技巧
- 2022-04-28 WPF使用StackPanel棧面板布局_實(shí)用技巧
- 2022-07-13 Linux OS 運(yùn)行python腳本中smtplib has no attribute SMTP_
- 2023-07-24 可拖拽表格保存拖拽順序,按照拖拽順序進(jìn)行下載
- 2022-08-03 C++中TinyXML讀取xml文件用法詳解_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支