django 3.0 异步 orm

Posted

技术标签:

【中文标题】django 3.0 异步 orm【英文标题】:django 3.0 async orm 【发布时间】:2019-12-20 08:45:31 【问题描述】:

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

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

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

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

【问题讨论】:

通常请求由不同的线程处理,因此据我所知,它已经是异步的每个请求 那么asgi 有什么意义呢?它与 django 2.0 有何不同?如果我将 django 2.0 与 py 3.5+ 一起使用,我仍然可以在视图中使用 await Django 3.0 引用了“正在开发对异步 Python 的支持”,但还远远没有准备好。见docs.djangoproject.com/en/3.0/topics/async 【参考方案1】:

正如 Willem 所说,它是按请求异步的。 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

【讨论】:

以上是关于django 3.0 异步 orm的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jupyter Notebook 中使用 django 3.0 ORM 而不会触发异步上下文检查?

Celery 3 版本 定时执行与 异步执行 | Django 案例

Django

Django

django —— Celery实现异步和定时任务

django中使用celery异步发送邮件问题