django 3.0 async

r9f1avp5  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(113)

由于django 3.0支持异步,我想知道数据库查询会发生什么。我在the official documentation中没有看到任何更新,我确信语法如下:

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

将完全阻塞当前线程,而该线程是由哪个事件循环运行的。如果数据库在20秒内返回响应,那么在这段时间内不会处理任何其他请求,这是令人讨厌的。
另一件让我疑惑的事情是:async只使用1个线程(如果我们至少不等待线程执行器中的事情)。事实是atomic(数据库)请求绑定到数据库的连接,数据库的连接绑定到线程局部变量。这意味着所有请求都将在单个线程中运行=所有请求都将具有相同的事务。

ikfrs5lh

ikfrs5lh1#

正如Willem所说,它是按请求异步的。asgi的不同之处在于,在单个请求中可以更快地解决它,因为在请求中它也是异步的。例如,当在BD上咨询或在web上咨询资源时。的确,Django 3.0仍然缺乏完全的异步,为了使用异步的好处,你必须使用asgi库,使用方法:sync_to_async和async_to_sync。查看此文档,以便了解其工作原理:https://channels.readthedocs.io/en/latest/topics/databases.html
同样,我也分享了这个联盟,它很好地解释了并行、异步和线程的所有差异。https://fastapi.tiangolo.com/async/#asynchronous-code

nzk0hqpo

nzk0hqpo2#

最后,在3 May上运行了3年的Django 4.2 released提供了对查询模型的异步支持

async def make_book(*args, **kwargs):
    book = Book(...)
    await book.asave(using="secondary")

相关问题