0

これは少し難しい質問です。

私はPythonでmod_wsgiを使用しており、継続的にHTMLを生成する出力バッファーを作成したいと考えています(ページの読み込みが完了するまで)。

現在、Application()関数がページコード用に個別の「ページ」スレッドを作成するようにスクリプトを設定し、その直後に、Pythonのキューライブラリを使用して出力バッファーの連続ループを実行しています。

これを設定するためのより良い方法はありますか?出力バッファを(ページではなく)スレッドにすることを考えましたが、問題は、Application()関数がApacheにHTMLを生成できる唯一の関数であるということです(私が知る限り、このアイデアを不可能にします)。

現在の設定で見られる欠点は、エラーが発生した場合に、ページスレッドを少し続行しないと、バッファを簡単に中断して終了できないことです。

(mod_wsgiにこれを処理するための出力バッファーが組み込まれていないのはちょっと残念です。ページ全体をロードしてから出力を1回だけ送信するのは嫌いです。その結果、ページのロードが大幅に遅くなります)。

4

2 に答える 2

2

mod_wsgiには、ジェネレーターのサポートが組み込まれている必要があります。したがって、CherryPyのようなフレームワークを使用している場合は、次のことを行う必要があります。

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

各yieldがページのチャンクをユーザーに返します。

実装とその仕組みに関するCherrPyの基本事項は次のとおりですhttp://www.cherrypy.org/wiki/ReturnVsYield

于 2009-06-01T18:45:04.103 に答える
2

(mod_wsgiにこれを処理するための出力バッファーが組み込まれていないのはちょっと残念です。ページ全体をロードしてから出力を1回だけ送信するのは嫌いです。その結果、ページのロードが大幅に遅くなります)。

ある種のストリーミングまたは非同期アプリケーションを実行している場合を除いて、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>']

最善の策は、リストのような可変データ構造を使用してメッセージのチャンクを保持し、上記のようにそれらを文字列に結合することです。特別なニーズがない限り、これがおそらく最良の一般的なアプローチです。

于 2009-06-01T23:41:08.140 に答える