2013-04-23 197 views
1

Django有类似于ASP.NET MVC的Asynchronous Controller吗?Django异步请求

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

澄清:

这里的流量我能有今天

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表达式,并返回响应。

回答

1

是的,只有当任务完成时,您才可以执行某些操作。你会想看看chain()。您可以在绑定链芹菜任务:

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

    chain() 

这两个功能first_function and second_function都将是芹菜功能。 second_function仅在first_function完成其执行时执行。

+0

欲了解更多信息:http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=chain#celery.chain – pynovice 2013-04-23 08:34:20

+0

我不想连锁任务。我会澄清。 – zmbq 2013-04-23 08:36:21

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

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

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

+0

至于1和3 - 我不想让客户发送另一个请求。它仍然足以被最终用户接受。 – zmbq 2013-04-23 09:05:08

+0

@zmbq您在网上没有很多选项。你可以做'轮询','长轮询'或'websockets'。如果你100%确定它可以在一个请求/响应周期内完成,你不应该使用芹菜。如果您确实使用了它,请选择我提到的3种方法中的任何一种。 ASP.NET的异步控制器,我怀疑,它只是隐藏了上述细节。 – rantanplan 2013-04-23 16:18:54

+0

ASP.NET的异步控制器所做的是在异步操作发生时在web服务器上释放一个线程。 Web服务器的线程可以自由处理另一个请求。异步任务完成后,Web服务器将其分配给其中一个正在运行的线程并继续处理。它与* client *轮询无关,使用websockets或其他。 – zmbq 2013-04-23 19:52:38