Django ORM数据库查询是否阻止服务器,还是异步?

时间:2013-02-12 09:59:21

标签: database django asynchronous orm twisted

我只是想澄清一些事情。

我相信Django服务器是异步工作的(因为如果来自客户端的每个请求都会阻塞服务器,那么它就不会工作),但我也知道Django ORM不是异步的。那么对数据库的查询会阻塞服务器吗? (我的意思是休息请求等待查询完成?)或者它可能完全不同,我误解了它。

我之所以这样问是因为我听说大多数ORM都是阻塞的,因此我无法在我的Twisted服务器中使用它们从db中获取数据而不会阻塞。

2 个答案:

答案 0 :(得分:6)

为什么服务器需要异步工作? Django是一个WSGI应用程序;并发模型取决于您运行它的服务器,可以是线程,多处理,异步(选择循环驱动)或它们的组合。

每个Django请求本身都是完全同步。查询数据库会阻止请求,直到返回结果。它不需要知道其他并发请求(除了确保Django以线程安全的方式处理数据结构)。

答案 1 :(得分:0)

我一直面临着你似乎遇到的类似问题。我的django应用程序执行大量调用休息服务来呈现视图,这让我感到困扰,他们必须被序列化。 我开发了这个:

https://github.com/kowalski/featdjango/

这是一个基于扭曲网络的应用服务器。与django-on-twisted项目不同,它根本不使用wsgi。 Django代码在一个线程中运行。有一个游泳池。扭曲的代码在主应用程序线程中运行并管理池。如果你需要从Django代码执行一些调用并且可以同时执行它,则需要创建一个返回Deferred(或DeferredList)的方法。从django代码开始,您可以通过以下方式调用它:

import threading
...

ct = threading.current_thread()
result = ct.wait_for_defer(method_to_call, *args, **kwargs)

这具有使用reactor.callFromThread()方法调用* method_to_call *并绑定回调以唤醒调用者线程的效果。返回Deferred的结果,或者引发异常(如果触发了errback())。