使用 ASGI 代替 WSGI 的缺点 [已关闭]

问题描述 投票:0回答:2

一般来说,在 Django 中使用 ASGI 而不是 WSGI 进行 HTTP 请求处理有哪些明显且明显的缺点?

我知道 ASGI 用于异步任务,但它也可以通过

http.*
通道处理同步 HTTP 请求。它是否比普通 WSGI 慢或者与 WSGI 相比是否有任何不支持的功能?

还有,在同一个项目中同时提供 REST API 和 websocket 处理,您更喜欢哪种方式,为什么?

  1. 不同服务器实例中用于 REST 的 WSGI + 用于 websocket 的 ASGI
  2. 同一台机器上用于 REST 的 WSGI + 用于 Websocket 的 ASGI
  3. ASGI 两者都适用
python django django-channels
2个回答
18
投票

我认为您会发现的一个主要缺点是 ASGI 服务器较新,因此测试较少,功能可能较少,数量较少,而且背后的社区可能较小。然而,我使用 ASGI 服务器(Daphne)来处理所有事情,并认为 Websockets 在用户体验方面提供了如此多的功能,以至于一切最终都会转移到 ASGI。

能够在代码中使用 asyncio 是 Web 编程的一个主要好处。您可以同时运行 10 个查询,同时访问缓存并在单个线程上同时发出 HTTP 请求,而不是依次运行 10 个查询并等待每个查询返回。

但是,您使用的所有 IO 操作都需要使用异步,否则您会看到性能更差。此外,所有开发人员都需要非常小心,切勿通过执行阻塞 IO 来阻塞事件循环。在异步上下文中阻塞 IO 是使用具有大量开销的线程来完成的。在单个线程上运行所有内容可以非常有效地使用 CPU 缓存。当您使用线程来阻塞 IO 时,您会导致 CPU 上下文切换,从而使 CPU 缓存失效。

Django 在异步方面表现较差,因为当前异步数据库方法的实现方式只是使用

sync_to_async
并使用线程池。

如果您不执行任何 IO,则将每个异步函数添加到事件循环中后,您会发现 asyncio 的性能更差。


10
投票

我没有做任何基准测试,但在几个项目中同时使用了 WSGI 和 ASGI,并且没有看到它们的性能之间有任何足够的差异,因此如果 Django WSGI 性能对您来说可以接受,那么 ASGI 也可以工作。

对于 REST + websockets API,我对两者都使用了 ASGI。如果您的项目中启用了 ASGI,则没有理由使用 WSGI(WSGI 通过 ASGI 工作)。

© www.soinside.com 2019 - 2024. All rights reserved.