【发布时间】:2020-02-16 03:14:27
【问题描述】:
Django 3 应该很快就会发布,它将能够在 ASGI 模式下工作。 ASGI 模式似乎使 Django 在处理请求时比在 WSGI 模式下更高效(如果我相信正确的话,每个时间单位可以处理更多请求)。它是如何实现的?是不是 Django 可以同时处理多个请求,但它们中的大多数会等待诸如从数据库中获取数据或其他 IO 操作之类的事件?
【问题讨论】:
Django 3 应该很快就会发布,它将能够在 ASGI 模式下工作。 ASGI 模式似乎使 Django 在处理请求时比在 WSGI 模式下更高效(如果我相信正确的话,每个时间单位可以处理更多请求)。它是如何实现的?是不是 Django 可以同时处理多个请求,但它们中的大多数会等待诸如从数据库中获取数据或其他 IO 操作之类的事件?
【问题讨论】:
主要区别在于同步与异步的性质。 同步代码在不同的线程或进程中运行并返回响应时被阻塞。做其他事情没有触发方法。
异步编程允许在事件循环中推送一段代码。在它执行之前做一些其他的事情,然后在完成后用它做一些事情。这是非阻塞和基于事件的方法。
来自docs
WSGI 出了什么问题?
您可能会问“为什么不升级 WSGI”?很多人都问过这个问题 多年来,问题通常最终是 WSGI 的单一可调用接口不适合更多人参与 WebSocket 等网络协议。
WSGI 应用程序是一个单一的、同步的可调用对象,它需要一个 请求并返回响应;这不允许长寿 连接,就像您使用长轮询 HTTP 或 WebSocket 获得的 连接。
即使我们使这个可调用异步,它仍然只有一个 提供请求的路径,因此具有多个传入的协议 事件(如接收 WebSocket 帧)无法触发。
ASGI 是如何工作的?
ASGI 被构造为单个异步可调用对象。它需要范围, 其中包含有关传入请求、发送、等待的详细信息 这使您可以向客户端发送事件并接收等待的 这使您可以从客户端接收事件。
这不仅允许多个传入事件和传出事件 每个应用程序,还允许一个后台协程,所以 应用程序可以做其他事情(例如在 外部触发器,例如 Redis 队列)。
【讨论】:
你说的情况是因为你在请求的整个过程中没有使用异步,因为在使用异步方式的情况下,你必须保证每个环节都使用异步,这样你的请求才不会阻塞在At某个阶段,可以保证Django异步模式同时可以处理更多的请求
【讨论】: