簡體   English   中英

Python Mod_WSGI輸出緩沖區

[英]Python Mod_WSGI Output Buffer

這是一個棘手的問題。

我正在python中使用mod_wsgi,並希望創建一個輸出緩沖區,該緩沖區可以持續產生HTML(直到頁面加載完成)。

現在,我已經設置了腳本,以便Application()函數為頁面代碼創建一個單獨的“頁面”線程,然后緊接着,它使用python的Queue lib為輸出緩沖區運行一個連續循環。

是否有更好的方法進行設置? 我曾考慮過將Output Buffer用作線程(而不是Page),但是問題是,Application()函數是唯一可以將HTML產生給Apache的函數,據我所知,使這個想法成為不可能)。

我在當前設置中看到的缺點是發生錯誤時,如果Page線程不繼續運行,我將不容易中斷緩沖區並退出。

(有點糟的是mod_wsgi沒有內置輸出緩沖區來處理此問題,我討厭加載整個頁面,然后只發送一次輸出,這會導致頁面加載慢得多)。

mod_wsgi應該內置了對Generators的支持。 因此,如果您使用CherryPy之類的框架,則只需執行以下操作:

def index():
    yield "Some output"
    #Do Somemore work
    yield "Some more output"

每個收益將返回給用戶頁面的大部分。

這是CherrPy的一些基礎知識,介紹了那里的實現及其工作原理http://www.cherrypy.org/wiki/ReturnVsYield

(有點糟的是mod_wsgi沒有內置輸出緩沖區來處理此問題,我討厭加載整個頁面,然后只發送一次輸出,這會導致頁面加載慢得多)。

除非您正在執行某種流或異步應用程序,否則您希望一次將整個頁面全部發送99.9%。 我能想到的唯一例外是,如果您發送的是大型網頁(大的意思是數百兆字節)。

我之所以提及這一點,是為了指出,如果您遇到性能問題,可能不是因為您正在緩沖輸出。 處理此問題的最簡單方法是執行以下操作:

def Application(environ, start_response):
    start_response('200 Ok', [('Content-type','text/plain')])
    response = []
    response.append('<h1>')
    response.append('hello, world!')
    response.append('</h1>')
    return [''.join(response)] #returns ['<h1>hello, world!</h1>']

最好的選擇是使用可變的數據結構(例如列表)來保存消息的塊,然后像上面一樣將它們連接成字符串。 除非您有某種特殊需要,否則這可能是最好的一般方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM