2

Django 是否有类似于 ASP.NET MVC 的异步控制器的东西?

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

澄清:

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

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

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

此代码可能会给服务器带来不必要的压力。ASP.NET MVCAsynchronousController提供的是将这个函数分成两部分的能力,类似于:

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

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

4

2 回答 2

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

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

  3. 最有可能的解决方案不应该是技术性的,而是在 UI/UX 领域。如果某件事需要很长时间,如果通知明确,则可以通知用户。

于 2013-04-23T08:53:03.500 回答
1

是的,只有当任务完成时,您才能做某事。你会想研究一个叫做chain(). 您可以在链中绑定 celery 任务:

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

    chain()

这两个函数first_function and second_function都是 celery 函数。second_function 只有在 first_function 完成执行时才会执行。

于 2013-04-23T08:32:52.787 回答