[英]Performing non-blocking requests? - Django
最近,我一直在使用其他框架,例如NodeJS。
我喜欢返回响应并仍然可以执行进一步操作的可能性。
例如
def view(request):
do_something()
return HttpResponse()
do_more_stuff() #not possible!!!
也许Django已经提供了一种在返回请求后执行操作的方法,如果这种情况很好。
帮助将不胜感激! = D
不要直接使用,因为您已经退出了方法。 您可以使用像Celery这样的东西,它将do_more_stuff
任务传递到队列中,然后使其在http请求/响应流之外运行do_more_stuff()
。
因为您要从函数返回,所以永远不会调用do_more_stuff。
如果您正在考虑做一些繁重的工作,请按照罗斯的建议在排队之前先排队(Celery +1)。
但是,如果您正在寻找返回某些内容...,那么您可能正在寻找做某件事并将更多内容返回给用户流。 您可以将迭代器或生成器传递给HttpResponse,它将以点滴的方式迭代并推出内容。 感觉有点不对劲,但是如果您是发电机摇滚明星,则可以在各种状态下完成足够的工作来完成您想要的。
或者我想您可以简单地重新设计页面,以使用大量的ajax来完成所需的工作,包括将事件触发到django视图,从视图中读取数据等。
归结为异步负担的重担:客户端,服务器或响应。
我还不太熟悉node.js,但是看到您正在谈论的用例将很有趣。
编辑:我做了一些调查信号,虽然它们确实发生在过程中,但在django处理了请求之后,有一个内置的request_finished信号,尽管它比特定的东西更笼统。
您可以将线程用作临时修复程序或非生产解决方案,但它既不可扩展,也不是最佳实践。 使用芹菜进行更好的设计!
def foo(request):
import threading
from time import sleep
def foo():
sleep(5)
# Do something
print('hello, world')
threading.Thread(target=foo).start()
return JsonResponse(data={'detail': 'thread started'})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.