Python Sanic 或异步框架使用 Asgiref 的原因?

Reasons For Python Sanic or Async Frameworks To Use Asgiref?

我知道答案是 "always depends",但一般来说,在 Sanic 等异步框架中使用 asgiref 包装器是有原因的。

https://github.com/django/asgiref https://github.com/channelcat/sanic

我的主要问题是,为什么有人会在异步框架中使用它,我了解 Django 的用例,但是如果您仔细考虑了异步编程,那么这样的方法似乎有点懒惰处理一个问题。

告诉我我错了。

我特别不熟悉asgiref。然而,话虽如此,我对 asgi 的想法很熟悉,它可以替代 wsgi。

对于Sanic来说,这有点无关紧要。 Sanic has its own server built in,开箱即用的异步操作。

我不想告诉你你错了,但我看不出它在 Sanic 世界中有什么用。

一、背景:

一些 asyncio 框架,例如 sanicaiohttp 早于 ASGI 成熟的时间点,因为适合作为 asyncio server/application 接口。

因此,他们已经在代码库中内置了网络服务器实现。他们可以改用 ASGI 作为接口,而不是他们自己的内部接口,但这对他们的维护者来说意味着一大堆工作。

那么,为什么可能值得付出努力?

好吧,如果他们做了,他们会得到的好处是:

  • 能够 运行 在一堆不同的服务器实现下。 (他们自己的实现,或者 uvicornhypercorndaphne 服务器中的任何一个。)能够在服务器实现之间透明地切换提供了一个更强大的生态系统,并且意味着服务器实现可以跨框架共享。 Sanic 将获得具有 HTTP/2 支持、Windows 支持和 PyPy 支持的服务器实现,并解决它在套接字流控制方面存在的一些突出问题。
  • 能够受益于共享中间件和其他工具。能够编写跨任何 ASGI 框架工作的中间件有助于整个生态系统。您可以编写与任何 ASGI 框架一起工作的调试中间件、静态文件服务、测试客户端等,而不必为每个框架构建新的东西。
  • 复杂性较低。拥有经过全面设计且独立的 server/application 界面有助于减少开发人员在查看应用程序框架内部时需要考虑的表面区域,因为这意味着您在服务器代码和应用程​​序代码之间有一个非常有据可查的边界.
  • 可组合。因为 ASGI 是一个可组合的接口,所以您可以以有用的方式组合它。例如,在同一网络服务器上提供两个不同的 Sanic 应用程序。

简而言之,ASGI 的好处与 WSGI 的好处相同。对于 sanic 来说,与现在编写新的 asyncio 框架的任何人相比,它都不是一个胜利,因为他们已经完成了编写服务器实现的所有繁重工作,但他们仍然可以从中获得好处,这绝对是整个社区的胜利。

相关:ASGI ticket on Sanic.

(另请注意 asgiref 只是一个 Python 包,其中包含一些用于使用 ASGI 框架的助手,它也恰好是保存 ASGI 规范文档的回购协议。问题是真正关于将 ASGI 用于 Sanic,而不是使用 asgiref。)