django 3.0 异步 orm

问题描述 投票:0回答:2

自从 django 3.0 支持异步以来,我想知道数据库查询会发生什么。我在官方文档中没有看到任何更新,我确信语法如下:

b5.name = 'New name'
b5.save()

将完全阻塞当前线程,即事件循环正在运行它。如果数据库返回响应 20 秒,则在此期间不会处理其他请求,这是令人讨厌的。

另一件事让我想知道:异步仅使用 1 个线程(如果我们至少不在线程执行器中等待)。事实是这样的:atomic(数据库)请求绑定到数据库的连接,该连接绑定到线程局部变量。这意味着所有请求都将在单线程中运行=所有请求都将具有相同的事务。

django python-asyncio django-3.0
2个回答
1
投票

正如 Willem 所说,它是按请求异步的。 asgi 的不同之处在于,在单个请求中它可以更快地得到解决,因为在请求中它也是异步的。例如,在 BD 上咨询或在网络上咨询资源时。 确实,Django 3.0 仍然缺乏完全异步的能力,为了使用异步的好处,你必须使用 asgi 库,使用以下方法:sync_to_async 和 async_to_sync。 查看此文档,以便您了解其工作原理: https://channels.readthedocs.io/en/latest/topics/databases.html

以同样的方式,我分享这个联盟,它很好地解释了并行性、异步、线程的所有差异。 ETC。 https://fastapi.tiangolo.com/async/#asynchronous-code


0
投票

终于,自 3 年来Django 4.2 于 5 月 3 日发布,并提供对查询模型的异步支持

async def make_book(*args, **kwargs):
    book = Book(...)
    await book.asave(using="secondary")
© www.soinside.com 2019 - 2024. All rights reserved.