2010-04-30 110 views
10

我一直在玩最近的其他框架,比如NodeJS。执行非阻塞请求? - Django

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

例如

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

    do_more_stuff() #not possible!!! 

也许Django的已经提供返回的请求后执行操作的方式,如果是这样,这将是巨大的情况下。


帮助将非常感谢! = D

回答

10

由于您已退出该方法,因此不能开箱即用。你可以使用类似Celery的东西,它会将do_more_stuff任务传递到队列中,然后在http请求/响应流之外运行do_more_stuff()

7

Django的让您与信号做到这一点,更多的信息可以发现here。 (请注意,我在下面的评论说,信号不无阻塞,但他们让你返回在视图中的响应后执行代码。)

如果你正在寻找到做很多很多异步请求并且需要它们是非阻塞的,那么您可能需要检查Tornado

+0

此外,这种方法不会在技术上是不可阻挡的Django是不是在大多数部署无阻塞架构,但它会让你做一些返回响应后。龙卷风会让你执行无阻塞的请求。 – Zack 2010-04-30 09:04:59

+0

@Zack:谢谢你,我没有意识到信号会帮助我。 – RadiantHex 2010-04-30 09:18:47

+0

不要忘记标记为答案:) – Zack 2010-04-30 09:27:55

2

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

如果您正在寻找在做繁重的东西排队东西,你回来之前罗斯建议(+1芹菜)。

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

或者我想你可以简单地重新设计你的页面中使用了大量的AJAX做你需要什么,包括发射了事件Django的观点,阅读从视图中的数据,等等

它种归结为异步的负担将放在哪里:客户端,服务器或响应。

我没那么熟悉Node.js的呢,不过看到你在谈论的使用情况下,它会很有趣。

编辑:我做了一些更寻找到信号,虽然他们确实发生在过程中,有一个内置的信号request_finished后的请求已被Django的处理,但它更是一个包罗万象的不是东西具体。

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