3

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

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

将完全阻塞当前线程,哪个事件循环正在运行它。如果数据库在 20 秒内返回响应,则在此期间不会处理其他请求,这很糟糕。

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

4

1 回答 1

1

正如威廉所说,它是按请求异步的。asgi 的不同之处在于,在单个请求中它可以更快地解决,因为在请求中它也是异步的。例如,在咨询 BD 或咨询网络资源时。确实,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

于 2020-01-22T15:38:48.050 回答