http通過(guò)StreamingHttpResponse完成連續(xù)的數(shù)據(jù)傳輸長(zhǎng)鏈接方式
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ǔ)城字符串,然后返回給客戶(hù)端,同時(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ù)器的性能。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python groupby函數(shù)實(shí)現(xiàn)分組后選取最值
這篇文章主要介紹了python groupby函數(shù)實(shí)現(xiàn)分組后選取最值,文章圍繞主題相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Python實(shí)現(xiàn)實(shí)時(shí)跟隨微信窗口移動(dòng)的GUI界面
Python寫(xiě)一些簡(jiǎn)單的GUI界面也是非常簡(jiǎn)單的,并且Python有著豐富的庫(kù),這些庫(kù)可以很方便我們?nèi)ゲ僮鱓indows系統(tǒng)。本文就來(lái)用Python編寫(xiě)一個(gè)實(shí)時(shí)跟隨微信窗口移動(dòng)的GUI界面吧2023-04-04
Python與AI分析時(shí)間序列數(shù)據(jù)
預(yù)測(cè)給定輸入序列中的下一個(gè)是機(jī)器學(xué)習(xí)中的另一個(gè)重要概念.本章為您提供有關(guān)分析時(shí)間序列數(shù)據(jù)的詳細(xì)說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-05-05
Python辦公自動(dòng)化Word轉(zhuǎn)Excel文件批量處理
這篇文章主要為大家介紹了Python辦公自動(dòng)化Word轉(zhuǎn)Excel文件批量處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
詳解python中的三種命令行模塊(sys.argv,argparse,click)
這篇文章主要介紹了python中的三種命令行模塊(sys.argv,argparse,click)的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
Python 圖像處理: 生成二維高斯分布蒙版的實(shí)例
今天小編就為大家分享一篇Python 圖像處理: 生成二維高斯分布蒙版的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
pytorch+lstm實(shí)現(xiàn)的pos示例
今天小編就為大家分享一篇pytorch+lstm實(shí)現(xiàn)的pos示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
使用 Python 處理3萬(wàn)多條數(shù)據(jù)只要幾秒鐘
在工作中經(jīng)常遇到大量的數(shù)據(jù)需要整合、去重、按照特定格式導(dǎo)出等情況。這篇文章主要介紹了使用 Python 處理3萬(wàn)多條數(shù)據(jù)只要幾秒鐘的相關(guān)知識(shí),需要的朋友可以參考下2020-01-01

