8

我只是想澄清几件事。

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

我问这个是因为我听说大多数 ORM 都被阻塞了,因此我不能在我的 Twisted 服务器中使用它们来从 db 获取数据而不阻塞扭曲。

4

2 回答 2

9

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

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

于 2013-02-12T10:03:09.930 回答
0

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

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

这是一个基于twisted web的应用服务器。与 django-on-twisted 项目不同,它根本不使用 wsgi。Django 代码在线程中运行。他们有一池。Twisted 代码在主应用程序线程中运行并管理池。如果您需要从 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() 被触发)。

于 2013-02-12T11:03:43.497 回答