5

応答を生成するためにほぼ5秒待機するアルゴリズムがあり、ユーザーが要求を送信したらすぐにack(http 200)を送信して、要求が受信されたことをユーザーに通知し、5秒間待機します。

ジェネレーター機能:

def chunked_res():
    yield "Chunk 1"

    stop = time.time() + 5    # wait for 5 seconds
    while time.time() < stop:
        pass

    yield "Chunk 2"

そして、いくつかの見方では:

response = HttpResponse ( chunked_res() )
response['Connection'] = 'close'
response['Transfer-Encoding'] = 'chunked'
response['status'] = 200
return response

ブラウザでの応答:

"Transfer-Encoding:chunked \ nstatus:200 \ nConnection:close \ nContent-Type:text / html; charset = utf-8 \ n \ nChunk 1Chunk 2"

問題: 必要な応答(チャンク1、チャンク2)を取得していますが、5秒後です。最初に「チャンク1」を送信し、5秒後に「チャンク2」を送信したい(更新応答)。これを実装するための特定の設定/変更はありますか?

アップデート:

Django = 1.4 python = 2.7

4

4 に答える 4

2

あなたは本当にこれを避けたい...

stop = time.time() + 5    # wait for 5 seconds
while time.time() < stop:
    pass

これにより、プロセスの CPU 使用率が 5 秒間 100% に急上昇します。これは Web アプリケーションとしては膨大な量です。共有ホスティング環境では、ホスティング プロバイダーから厄介な電子メールを受け取るリスクがあり、独自のサーバーを持っている場合は、ループで食い尽くすサイクルを他のリクエストの処理に有効に展開できます。代わりにこれを行います:

time.sleep(5)

これにより、スレッド (またはプロセス) が 5 秒間スリープ状態になり、カーネルは自由に他のタスクをスケジュールしたり、他に何もすることがなければ CPU をスリープ状態にしたり (電力と冷却のコストを節約) したりできます。

于 2014-01-12T03:37:18.917 に答える
2

彼らはdjango 1.5にStreamingHttpResponseを追加したばかりで、以前のバージョン(<= 1.4)でイテレータを渡すことで、データをストリーミング(または「チャンク」)できます。

def chunked_res():
    yield "Chunk 1"

    time.sleep(5)  # wait for 5 seconds

    yield "Chunk 2"


def myview(request):
    g = chunked_res()
    return HttpResponse(g)
于 2013-03-18T06:59:14.793 に答える
2

実際の解決策は、ブラウザーが段階的に表示できるように、最初のチャンク サイズを少なくとも 1024 文字にすることでした。

Django で HttpResponse をストリーミングする方法

def chunked_res():
    yield "Chunk 1"
    yield " " * 1024  # Encourage browser to render incrementally (either 1024 or 1024-7{length of "chunk 1"} = 1017)

    time.sleep(5)  # wait for 5 seconds

    yield "Chunk 2"


def myview(request):
    g = chunked_res()
    return HttpResponse(g)

nginxを使用している場合は、 proxy_buffering =offを設定する必要があります。これにより、サーバーは応答を 1024 データ チャンク準備完了としてフラッシュします。 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size

対応: HTTP/1.0 および HTTP/1.1

于 2013-03-22T11:50:51.700 に答える