Django异步请求

时间:2013-04-23 08:20:34

标签: django asynchronous celery

Django是否有类似于ASP.NET MVC的Asynchronous Controller

我有一些请求将由芹菜工人处理,但不会花很长时间(几秒钟)。我希望客户在工作完成后得到响应。我可以让我的视图功能等待任务完成,但我担心它会给网络服务器带来太多负担。

澄清:

这是我今天可以拥有的流程

def my_view(request):
    async = my_task.delay(params)
    result = async.get()
    return my_response(result)

async.get()可能需要几秒钟 - 不会太长,以至于客户端无法等待HTTP响应返回。

此代码可能会给服务器带来不必要的压力。 ASP.NET MVC的AsynchronousController提供的功能是能够将此功能分解为两个,类似于此:

def my_view(request):
    async = my_task.delay(params)
    return DelayedResponse(async, lambda result=>my_response(result))

这将释放Web服务器以处理其他请求,直到异步操作完成。完成后,它将在结果上执行lambda表达式,并返回响应。

2 个答案:

答案 0 :(得分:2)

  1. 您可以返回状态“正在进行”,然后再发送一个请求以检查状态是否已更改,而不是等待请求完成。由于您正在进行纯查找,因此响应速度非常快,并且不会给您的Web服务器带来太大负担。

  2. 您可以将此特定视图/功能外包给专为异步回调而设计的Tornado Web服务器。该网站的其余部分可能继续在django上运行。

  3. 解决方案很可能不是技术性的,而是UI / UX领域。如果需要很长时间,如果通知清楚,可以通知用户。

答案 1 :(得分:1)

是的,您只能在任务完成时执行某些操作。您可能希望查看名为chain()的内容。您可以在链中绑定芹菜任务:

    chain = first_function.s(set) | second_Function.s(do)

    chain()

这两个函数first_function and second_function都是芹菜函数。仅当first_function完成执行时才执行second_function。