6

これはPythonの質問かもしれません。確かにそれはおかしなものです。

クライアントは計算集約型のページ[page-1]を要求し、最終的に2番目の計算集約型のページ[page-2]を要求します。これは、page-1の要求がわかっているインスタンスで計算できます。最初の応答のパフォーマンスが大幅に低下するため、ページ1を提供する前に各データセットを計算したくありません。

クライアントがページ1を読み取っている間に、ページ2の値を計算したいと思います。クライアントは、ページ1データの異なるビューを提供する応答を引き起こすいくつかのボタンをクリックする場合もありますが、集中的な計算は必要ありません。最終的には、必ずしもすぐにではありませんが、クライアントは2ページを要求します。私は、事前にレンダリングされた応答で応答できるようにしたいと考えています。

どうすればよいですか?

4

1 に答える 1

8

コメントで述べたように、非同期のバックグラウンドタスクでこれを処理し、結果をDjango低レベルキャッシュに保存する必要があるようです。私は個人的にタスクキューにセロリを使用します。

基本的に、ページ1が要求された後、非同期タスクを追加してページ2の計算を開始し、結果をキャッシュに保存します。したがって、ページ2が要求されたときに、キャッシュ内の事前にレンダリングされた応答を確認し、存在しない場合は、値を同期的に計算できます。

したがって、コードは次のようになります(タスクはアプリのtask.pyファイルにありますが、これで一般的なアイデアが得られるはずです)。

from celery import task
from django.core.cache import cache

def page_two_calculation(arg1, arg2):
    return arg1 + arg2

@task
def page_two_task(arg1, arg2):
    result = page_two_calculation(arg1, arg2)
    cache_key = "page-two-%s-%s" (arg1, arg2)
    cache.set(cache_key, result)

def page_one(request, arg1, arg2):

    # Start the page two task
    page_two_task.delay(arg1, arg2)

    # Return the page one response
    return HttpResponse('page one')

def page_two(request, arg1, arg2)
    cache_key = "page-two-%s-%s" (arg1, arg2)
    result = cache.get(cache_key)
    if result is None:
         # the result will only be None if the page 2 calculation
         # doesn't exist in the cache, in which case we'll have to
         # return the value synchronously.
         result = page_two_calculation(arg1, arg2)
    return result
于 2013-01-16T07:13:35.837 に答える