Django 是同步的还是异步的?

Django is synchronous or asynchronous?

Django 是同步的还是异步的?
我想知道 Django 框架是同步的还是异步的。 我听说面试的问题他们问你用的框架是同步的还是异步的。所以想知道同步和异步在web开发方面的意义

Django 本身是同步的。

每个 HTTP 请求都将完全同步处理。

但是你有像 django-channels ( https://github.com/django/channels ) 这样的扩展,它们是异步的并且用于网络套接字等。

这有点过于简单化了:但是同步编程是指如果您编写代码,从头到尾处理一个 HTTP 请求,并且在一个线程或一个进程中执行,并且如果一个进程/一个线程只处理一个一次请求。

使用 python,特别是使用 asyncio 或使用 twisted 可以编写这样的代码,process/thread 可以处理多个请求。每当一个请求等待接收网络上的新数据或发送一大块数据时,它可以处理另一个请求,直到其他请求等待网络准备就绪。

Django 版本 < 3.0 但是不使用 twisted 或 asyncio,因此 http 请求仅以同步方式处理。

然而,新的网络服务器/网络应用程序不仅可以处理 http 请求,还可以使用网络套接字。 Django 通道模块是为处理网络套接字而构建的。它是用 asyncio 实现的,它允许只用一个进程处理许多 web 套接字。它将通过消息(例如 redis)与 Django 的同步部分进行交互

附录:@Sayse 指出 Django 3.0 将支持异步代码。 然而: 只有我理解,ORM 操作仍将是同步的。它们将在异步事件循环中失败并出现 SynchronousOnlyOperation 异常(或者它们必须卸载到线程池)。因此,大多数真正的 Django 视图可能会失败或将依赖于线程池,因为 Django 的原因之一是使用 ORM 进行数据库访问。