91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

http如何通過StreamingHttpResponse完成連續的數據傳輸長鏈接

發布時間:2022-02-14 09:59:38 來源:億速云 閱讀:514 作者:小新 欄目:開發技術

這篇文章主要介紹了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的過程中,所以這有可能會降低服務器的性能。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“http如何通過StreamingHttpResponse完成連續的數據傳輸長鏈接”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳原县| 东乌珠穆沁旗| 藁城市| 丰宁| 黔南| 台东市| 大邑县| 万安县| 永平县| 双牌县| 高碑店市| 四会市| 山阴县| 阆中市| 东城区| 宝应县| 天全县| 修武县| 天峻县| 怀远县| 南平市| 雷州市| 绥宁县| 巩义市| 延安市| 囊谦县| 柳州市| 红安县| 滨州市| 新巴尔虎右旗| 新郑市| 昌乐县| 剑阁县| 无为县| 凉山| 清丰县| 南宫市| 宁远县| 全椒县| 泾源县| 霍州市|