繁体   English   中英

执行非阻塞请求? -Django

[英]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()

Django使您可以使用Signals完成此操作,更多信息可以在此处找到。 (请注意,正如我在下面的评论中所述,信号并不是非阻塞的,但它们确实允许您在视图中返回响应后执行代码。)

如果您正在考虑执行许多异步请求,并且希望它们是非阻塞的,那么您可能想看看Tornado

因为您要从函数返回,所以永远不会调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM