执行非阻塞请求? - Django

时间:2010-04-30 08:51:52

标签: python django asynchronous nonblocking

我最近一直在玩其他框架,比如NodeJS。

我喜欢返回回复的可能性,并且仍然能够进行进一步的操作。

e.g。

def view(request):
  do_something()
  return HttpResponse()

  do_more_stuff() #not possible!!!

也许Django已经提供了一种在返回请求后执行操作的方法,如果情况会很好的话。


非常感谢帮助! = d

4 个答案:

答案 0 :(得分:10)

没有开箱即用,因为你已经退出了该方法。您可以使用类似Celery的内容将do_more_stuff任务传递到队列,然后让它在http请求/响应流之外运行do_more_stuff()

答案 1 :(得分:7)

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

如果您正在考虑做很多异步请求并且需要它们是非阻塞的,那么您可能需要查看Tornado

答案 2 :(得分:2)

因为你从函数返回,所以永远不会调用do_more_stuff。

如果你正在考虑做一些繁重的工作,那么在你回来之前排队一些事情就像罗斯建议的那样(芹菜+1)。

如果您正在寻找返回某些内容...然后做一些事情并将更多内容返回给用户流式传输可能就是您正在寻找的内容。您可以将迭代器或生成器传递给HttpResponse,它将以涓流方式迭代并推出内容。感觉有点糟糕,但如果你是一名发电机摇滚明星,你可以在不同的状态下做足够的事情来完成你想要的。

或者我猜你可以简单地重新设计你的页面以使用大量的ajax来做你需要的事情,包括向django视图发射事件,从视图中读取数据等等。

可归结为异步负担的位置:客户端,服务器或响应。

我对node.js并不熟悉,但看到你正在谈论的用例会很有趣。

编辑:我对信号进行了一些调查,虽然它们确实在进行中,但是在django处理请求之后有一个内置的request_finished信号,尽管它更多的是比特定的东西更具吸引力。

答案 3 :(得分:1)

您可以将线程用作临时修订或非生产解决方案,但它既不可扩展也不是最佳实践。使用芹菜更好的设计!

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'})