6

这可能是一个python问题。可以肯定的是,这是一个愚蠢的问题。

客户端请求计算密集型页面 [page-1] 并将最终请求第二个计算密集型页面 [page-2],该页面可以在已知请求 page-1 的情况下计算。我不想在提供第 1 页之前计算每组数据,因为它会显着降低初始响应的性能。

我确实想在客户端读取第 1 页时计算第 2 页的值。客户端也可能单击一些按钮,这些按钮会导致提供不同视图的第 1 页数据的响应,但不需要进行密集计算。最终但不一定立即,客户会要求第 2 页,我希望能够以预渲染的响应进行响应。

我该怎么做呢?

4

1 回答 1

8

正如评论中提到的,听起来您需要使用异步后台任务来处理这个问题,将结果保存在Django 低级缓存中。我个人会使用芹菜作为任务队列。

基本上,在请求第一页后,您将添加一个异步任务来启动第二页计算,并将结果存储在缓存中。因此,当请求第 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 回答