【问题标题】:Do Django ORM database queries block the server, or are they asynchronous?Django ORM 数据库查询会阻塞服务器,还是异步的?
【发布时间】:2013-01-27 14:21:15
【问题描述】:

我只想澄清几件事。

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

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

【问题讨论】:

    标签: database django asynchronous orm twisted


    【解决方案1】:

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

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

    【讨论】:

    • 那我没有得到一些简单的东西。我到处都听到异步 > 同步,但 Django 是同步的。它是如何运作良好的(我知道它可能是另一个 SO 问题的主题,但它只是困扰我)。
    • 这意味着我不能从 Django 异步向另一个服务发出请求,例如从 RESTful API 获取数据?
    • 在执行大量 I/O 时异步可能会更快,但使用起来也更难。但是好的缓存层有助于缓解和消除差异。标准 Django 中没有任何东西可以帮助处理对外部 RESTful API 的异步请求,不。你可以看看 Celery,这是一个非常棒的异步工作者架构,它与 Django 集成得非常好。
    • "为什么服务器需要异步工作?"好吧,因为这样您就可以对在类似套接字的对象(如数据库、REST API 和文件)上找到的不同数据源发出多个并行请求……然后产生结果可能比串行执行多个同步操作要快得多。
    • @Sniggerfardimungus:当然,这就是为什么您将 WSGI 服务器配置为使用线程和/或多处理。问题是假设 Django 需要以某种方式处理并发性。它不是开箱即用的,而是将其留给 WSGI 服务器(其中 Django 是插入该服务器的 WSGI 应用程序)。这并不是说您不能在请求处理程序中添加异步处理,请参阅 Django Workload project codebase 以获取 asyncio 示例。免责声明,我编写了该代码。
    【解决方案2】:

    我一直面临着您似乎遇到的类似问题。我的 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() 被触发)。

    【讨论】:

    • 我可能会在不同的机器上运行 django 并扭曲,所以它不适用于我的情况,但感谢您的回答。
    • 这也是我的情况。我有一个 django 和扭曲的组件。但有时 django 视图需要对 twisted 执行多次调用。比我从我所解释的中受益。
    • 哦,我现在明白了。但我不会对 Twisted 执行多个请求,而且我会相对很少这样做。
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多