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表达式,并返回响应。
答案 0 :(得分:2)
您可以返回状态“正在进行”,然后再发送一个请求以检查状态是否已更改,而不是等待请求完成。由于您正在进行纯查找,因此响应速度非常快,并且不会给您的Web服务器带来太大负担。
您可以将此特定视图/功能外包给专为异步回调而设计的Tornado Web服务器。该网站的其余部分可能继续在django上运行。
解决方案很可能不是技术性的,而是UI / UX领域。如果需要很长时间,如果通知清楚,可以通知用户。
答案 1 :(得分:1)
是的,您只能在任务完成时执行某些操作。您可能希望查看名为chain()
的内容。您可以在链中绑定芹菜任务:
chain = first_function.s(set) | second_Function.s(do)
chain()
这两个函数first_function and second_function
都是芹菜函数。仅当first_function完成执行时才执行second_function。