HTTPX 和 AIOHTTP 是 Python 中两个流行的 HTTP 库。在下文中,我将比较这两个库的相似之处和不同之处,帮助你选择适合你任务的库
在开发需要访问或发送数据到远程服务器的应用程序时,发送网络请求是必不可少的。在 Python 中,用于此目的的事实标准库是 urllib3,但由于其复杂性,我们逐渐接受并使用第三方 HTTP 客户端 Requests 作为标准。我个人在大多数脚本中也使用 Requests。
然而,在某些方面,其他 HTTP 库比 Requests 表现更好。其中包括 HTTPX、httplib2、AIOHTTP 和 GRequests。在本文中,我们将重点关注 HTTPX 和 AIOHTTP。我将帮助你比较这两个库,以便帮助你为你的任务选择最佳的一个。在深入比较之前,让我们简要了解一下这两个库。
什么是 AIOHTTP?
AIOHTTP 是一个功能强大的 Python 异步 HTTP 客户端/服务器框架,旨在高效处理并发连接。它利用 asyncio 模块提供非阻塞 I/O 操作,使其适用于需要处理大量并发连接的应用程序。可以使用以下命令从 PyPI 安装此库。
pip install AIOHTTP
以上命令将安装 AIOHTTP 及其所有依赖项,包括 async_timeout、attrs、multidict 和 yarl。AIOHTTP 的主要功能之一是它支持中间件,这允许你编写适用于所有请求的可重用组件。
什么是 HTTPX?
AIOHTTP 适用于服务器/客户端,而 HTTPX 则是一个用于发送 HTTPS 请求的客户端库。它基于与 Requests 相同的原理构建,但更现代,并包含高级功能,尤其是在性能优化和异步编程方面。
HTTPX 的优点之一是它支持 HTTP/2 协议,该协议是最新协议,可增强更快、更高效的通信。
它还带有基于流的响应、TLS 支持、自定义标头和身份验证以及 JSON/XML 序列化。有趣的是,它的 API 与 Requests 类似,这使得它与 Requests 非常兼容,你可以轻松地在它和 Requests 之间切换。下面是安装 HTTPX 的命令。
pip install httpx
AIOHTTP 和 HTTPx 有何相似之处?
AIOHTTP 和 HTTPX 库在许多方面具有相似的功能。它们还具有一些相似之处,使得使用它们中的任何一个执行某些任务与使用另一个执行某些任务相同。在本节中,我将介绍两者的一些相同之处。在本节之后,我们可以转到真正的差异。
异步支持
这两个库之间的主要相似之处以及人们除了非常流行的 Requests 之外想要使用它们的原因之一是它们的异步支持。请注意,虽然 httpx 支持异步和同步操作,但 AIOHTTP 从一开始就是异步构建的。
在发送 Web 请求的上下文中,异步意味着能够发送多个请求,而不会有一个线程阻塞另一个线程。这两个库都支持异步发送 Web 请求,并且都使用 asyncio 模块来实现这一点。
支持 HTTP 请求/响应处理
这两个库都可以用作 HTTP 客户端,能够发送请求和处理响应。支持非常全面,因为你可以发送从 GET、PUT、DELETE 到 POST 的所有类型的请求。它们还允许你自定义 HTTP 请求标头并提供身份验证。通常,HTTPX 和 AIOHTTP 在 HTTP 功能支持方面是相同的。
与其他 Asyncio 库集成
这两个库都与兼容 Asyncio 模块的异步库很好地集成在一起,可用于在 Python 中进行异步编程。例如,在开发异步 Web 抓取工具时,仅使用 HTTPX 或 AIOHTTP 是不够的。你需要其他库来实现异步,而 aiomysql 之类的库是 MySQL 的一个很好的替代品,它可以很好地与两者集成。
HTTPX 和 AIOHTTP 之间的区别
它们之间既有相似之处,也有差异之处,你应该关注这些差异之处,因为它们将帮助你选择在项目中使用哪种。下面让我们来看看其中的一些。
同步支持
在上面的相似之处部分中,我提到这两个库都支持异步操作并使用 asyncio 模块来实现这一点。这意味着在异步编程方面,它们是相同的。然而,在同步编程方面,一个线程阻塞一个线程,一个线程等待另一个线程完成后再继续,它们是完全不同的。
HTTPX 主要设计为异步编程,但借助 httpx.Client 类也支持同步编程。这样,操作就从非阻塞转换为阻塞操作,每个请求都会阻塞线程,直到完成。
它还限制了线程数。这使得 HTTPX 与 Requests 兼容,因为 Requests 是同步的,并且具有与 HTTPX 库类似的 api 端点。
另一方面,AIOHTTP 库从一开始就是为异步而构建的。它的所有操作(从发送 Web 请求到写入套接字,再到读取响应)都设计为异步的。
它不支持同步编程,因此,如果你想从同步库迁移到它,你将面临兼容性问题,因为你必须进行重大更改。在同步/异步方面,HTTPX 支持两者,而 AIOHTTP 仅支持异步编程。
重点
这里的重点是指可以使用每个库的区域。HTTPX 是轻量级的,基本上是一个 HTTP 客户端库。它是 Requests 库的异步替代方案,并且完美地完成了工作。
另一方面,AIOHTTP 有所不同,因为它的应用范围更广。有了 AIOHTTP 库,你就有了一个既可以用作服务器又可以用作客户端的工具。这意味着除了执行 HTTPX 的工作外,它还可以用作 Web 服务器。
Web 服务器支持中间件,允许你编写挂接到请求/响应周期的可重用组件。它还支持信号和自定义路由,非常适合编写小型可扩展的 Web 服务器。
从重点上看,AIOHTTP 库更胜一筹,因为它既可用于编写服务器应用程序,也可用于编写客户端应用程序。而 HTTPX 则仅适用于客户端编程。
现代性和 API
HTTPX 于 2019 年刚刚推出几年,而 AIOHTTP 自 2016 年推出以来就存在得稍微长一点。通常,AIOHTTP 更受欢迎,部分原因在于它存在的时间很长。
然而,HTTPX 简洁而现代的特性帮助它获得了普及,并且其使用率正在上升。在 API 设计和可读性方面,HTTPX 被认为是简洁而现代的,甚至看起来更像流行的 Requests Client 库。
这与 AIOHTTP 截然不同,后者的 API 虽然在某些场景下很有用,但过于冗长和复杂。在功能和特性方面,HTTPX 也被视为现代的,因为它支持 HTTP/2 和更高级的请求自定义。
总的来说,HTTPX 库由于其现代的设计和特性而获得了认可,而 AIOHTTP 虽然可以运行,但却被认为是冗长的。
性能
从上面的相似性部分可以看出,它们都是为异步活动而构建的。但是,你不知道的是,两者中哪一个在性能上实际上更好。在性能方面,Oxylabs 团队在比较 AIOHTTP 和 HTTPX 方面做得非常出色。请阅读此处以了解有关这两个库的性能的更多信息。
在发送 100 个异步请求的测试中,AIOHTTP 在 1.19 秒内完成请求,而 HTTPX 则花费了 1.22 秒。这里的差异可以忽略不计。但是,当请求数量增加到 1000 个请求时,这种差异变得更加明显。
这是因为 AIOHTTP 发送 1K 个请求用了 3.79 秒,而 HTTPX 用了 10.22 秒。由此我们可以说 AIOHTTP 在性能方面更胜一筹。但是,重要的是你要知道这是一个规模问题。
如果你要发送大量请求,使用 AIOHTTP 可能会有所不同。但对于少量请求,你不会在速度上获得任何显著差异。
如何选择正确的库?
从上面可以看出 HTTPX 和 AIOHTTP 的相同点和不同点,一般来说,不能以相同点作为选择库的标准,而应该关注不同点。
重要的是,你知道它们都是功能强大且出色的 HTTP 客户端库,但它们都不是 100% 适合所有任务。你必须根据一些情况做出选择。让我们看看下面的一些情况。
项目需求
除非你没有项目需求,否则,它是使用哪个库的首要决定因素。需求是否明确指出你需要使用特定的库?如果是,那么你必须坚持下去。
如果没有,那么你需要仔细查看需求,看看哪一个最适合该需求。例如,如果你需要使用 HTTP/2,则意味着 HTTPX 是这里的选项,因为另一个不支持它。
另外,你是否还需要编写服务器应用程序,并且需要一个可以用于客户端和服务器的库?如果答案是肯定的,那么 AIOHTTP 就是最佳选择。项目要求中还有其他微小的细节,例如需要同步支持,在这种情况下,HTTPX 是两者之间唯一支持同步的选择。
性能要求
速度方面的性能是重要因素还是主要决定因素?如果是,那么你必须使用更快的库。例如,我在讨论两个库之间的差异的部分中给出的示例,当你发送 100 个异步请求时,它们之间的速度差异小于 500 毫秒。
在这种情况下,仅仅因为速度快而选择更快的版本并不是明智的决定,因为对于 100 个请求来说,速度优势可以忽略不计。但是,当我们对其进行调整并发送超过 1K 个请求时,差异变得更加明显,AIOHTTP 更快,相差 6.43 秒。
在这种情况下,差异已经足够显著了。仅凭这一点还不是决定性因素。性能必须如此重要,以至于第二次延迟可能意味着好或坏。例如,在博彩套利中,AIOHTTP 会做得更好,因为它可以在更短的时间内抓取更多的赔率,并且比 HTTPX 更快地为大量事件反复执行此操作。
易于使用
另一个决定因素是你是否需要易于使用的解决方案。我已经说过,HTTPX 简洁、现代,界面更直观。这使得它非常易于使用。如果你已经知道如何使用 Requests 库,那么这里的学习曲线会很平缓,因为它们共享类似的 API 端点。
这与 AIOHTTP 完全不同,AIOHTTP 被认为更加冗长和复杂。然而,这并不会降低 AIOHTTP 的功能性,这只意味着作为初学者,你将花费更多时间学习其 API 以及如何完成任务,即便如此,与使用 HTTPX 相比,某些任务需要占用更多空间才能完成。
结 论
最终,关于 HTTPX 和 AIOHTTP 哪个更好的争论没有明确的答案,因为这取决于具体情况。如果性能是你项目中的一个重要指标,或者你还需要开发服务器,那么 AIOHTTP 是你的最佳选择。
然而,如果你想要一个具有现代设计、易于使用的 API,并支持同步请求的库,那么你应该选择 HTTPX。它们都是优秀的库,支持异步请求,并且通常对请求的自定义有良好的支持。

