HTTPX 与 AIOHTTP 与 Requests:选择哪个?

Python 有三个众所周知的库用于发送 HTTP(超文本传输协议)请求: HTTPX、AIOHTTP 和 Requests。 所有这些都有其独特的优点和缺点。

通常,您需要对同步 HTTP 请求使用 Requests,在需要同步和异步混合时使用 HTTPX,在只需要异步请求时使用 AIOHTTP。

请求库

请求可能是最流行的 Python 库之一。内置的 "urllib3" 和其他 HTTP 请求库非常复杂且难以解析。 发出请求是为了简化发送 HTTP 请求的过程。

您可以通过 pip 安装库:

python -m pip install requests

安装后, 您需要导入库。 您可以通过添加以请求命名的方法(例如,get; post; delete)来发送各种 HTTP 请求。

import requests

response = requests.get("https://example.com")

print(response.text)

简单性是请求的主要卖点,尤其是与 urllib3 相比。大多数方法和函数都非常直观, 使该库非常适合初学者。

它也经常与 Selenium 等各种浏览器自动化工具结合使用,用于 Python Web 开发。

请求与其他库概要

不幸的是,该库也有一些主要缺点:

  1. 不支持异步 Requests 用于同步编程。虽然您可以解决此问题,但通常最好选择 HTTPX 或 AIOHTTP 来完成这项工作。

  2. 不支持 HTTP/2 请求使用 HTTP/1.1,这是协议的较慢版本。当比较 Requests 与 HTTPX 或 AIOHTTP 时,它总是较慢的库。

  3. 基于 "urllib3" 构建 Requests 继承了 "urllib3" 的所有优点和缺点,因为它是建立在它之上的。随着时间的推移,改进的空间越来越小,即使该图书馆确实得到了大量的社区支持。

HTTPX 库

HTTPX 协议是一个受 Requests 启发的库,但尝试修复与其相关的所有问题。因此, HTTPX 同时提供异步兼容性和 HTTP/2 支持。

这些重大改进使 HTTPX 成为一种流行的库。 此外,由于它受到 Requests 的启发,因此大多数方法和函数都是相同的。

python -m pip install httpx

安装库后,导入它。大多数方法都是相同的 -- 每个 HTTP 请求都是与其名称关联的方法。

import httpx

response = httpx.get("https://example.com")

print(response.text)

异步兼容性遵循发送 HTTP 请求的相当标准的结构。

import httpx

import asyncio

async def fetch(url):

async with httpx.AsyncClient() as client:

response = await client.get(url)

return response.status_code, response.text

async def main():

url = "https://www.example.com"

status_code, content = await fetch(url)

print(f"Status Code: {status_code}")

print(f"Content: {content[:100]}...") # Printing only the first 100 characters

if name == "main":

asyncio.run(main())

虽然您可以将 "asyncio" 与 Requests 一起使用,但它会涉及将同步调用包装在异步包装器中, 这可能不如从头开始使用专为异步 I/O 设计的库有效。

HTTPX 与其他库概要

与任何其他库一样,HTTPX 也有一些缺点:

  1. 相对较新

将 Requests 与 HTTPX 进行比较时,后者要更新得多。虽然它变得越来越稳定和受到更多支持,但该库仍有很长的路要走。

  1. 更高的依赖性 HTTPX 的依赖项比请求多,这在最小化依赖项至关重要的环境中可能很重要。

  2. 学习曲线 HTTPX 具有许多功能,因为它结合了同步和异步兼容性。AIOHTTP 和 Requests 都只关注一个,这使得它们更容易学习。

AIOHTTP 库

最后,HTTPX vs Requests vs AIOHTTP 组的第三个成员是一个仅用于异步编程的库。它构建在 "asyncio" 框架之上,使其成为从头开始异步发送 HTTP 请求的库。

但是,AIOHTTP 与 HTTPX 和 Requests 完全不同。 它有点难以使用,因为发送单个 HTTP 请求需要几行代码。AIOHTTP 开发人员知道 -- 甚至还有一个专门的页面来解释原因.

要开始使用,您需要先安装 AIOHTTP 库:

python -m pip install AIOHTTP

设置整个过程有点复杂,需要一些解释。

import aiohttp

import asyncio

async def fetch(url):

async with aiohttp.ClientSession() as session:

async with session.get(url) as response:

print(f"Status: {response.status}")

content = await response.text()

print(f"Body: {content[:100]}...") # Print the first 100 characters of the body

async def main():

url = "https://www.example.com"

await fetch(url)

Run the main function

if name == "main":

asyncio.run(main())

导入库后,我们必须定义一些函数。

"fetch" 函数是我们将发送 GET HTTP 请求的函数。与常规 Python 函数不同, 我们必须包含 "async" 才能使其成为异步函数。

首先,我们必须创建一个 session 对象,它允许我们发送大量具有相同参数的 HTTP 请求。 "Async with" 在退出块后关闭会话,即使发生异常也是如此。部分原因是性能和防泄漏,另一部分是语法糖。

"Async with" 在下一行中执行相同的操作。 但是,我们随后使用 session 对象发送 GET HTTP 请求。

打印输出相对不言自明。但是,内容对象有一个主要区别 -- "await",它会冻结"fetch"函数的实例。 当该调用被冻结时,"fetch" 的其他实例(或其他通常的异步函数)可以并行运行。

因此,Requests 与 AIOHTTP(在某种程度上是 HTTPX)的强大之处在于显而易见的。 使用 AIOHTTP,您可以同时运行多个 HTTP 请求,而不是一个接一个地发送。

AIOHTTP 与其他库概要

与其他库一样,也有一些主要缺点:

  1. 无同步支持

它不是为同步请求构建的库,因此在比较 Requests 与 AIOHTTP 时,您将前者用于同步,后者用于异步。没有理由不这样做。

  1. 学习曲线和复杂性

在这三个库中,它是学习最复杂的库。

  1. 调试困难

在比较大型代码库的 Requests 和 AIOHTTP 时,前者总是比后者更容易调试。

比较 HTTPX 与 AIOHTTP 与 Requests

在所有三个主要 HTTP 请求库之间进行选择时,您应该首先确定您需要同步还是异步兼容性。 任何一个库都将删除其中一个库,留下 Requests vs HTTPX 或 HTTPX vs AIOHTTP。

此外,还要考虑项目范围。 如果需要寄几个用于 Web 抓取的 HTTP 请求或任何其他方式,更简单的库将更好地为您服务,留下 HTTPX vs Requests 可供选择。如果您需要在主要代码库上发送异步 HTTP 请求,只有一个选项 -- AIOHTTP。

最后,优化问题也会影响您在 HTTPX 与 Requests 还是 AIOHTTP 之间进行选择。如果网络速度和性能在您的项目中起着重要作用,那么 HTTPX 与 AIOHTTP 是两种选择。

图书馆 性能 异步兼容性 易用性 学习曲线

请求 慢 无异步 HTTP 请求 最高 最低

HTTPX 协议 中间地带 为 HTTP 请求提供两种类型的兼容性 高,与 Requests 相当 低,与 Requests 相当

AIOHTTP 最好,可与 HTTPX 相媲美 仅为 HTTP 请求提供异步功能 最低 最高

相关推荐
永卿0011 分钟前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡
Stark、2 分钟前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
人类群星闪耀时38 分钟前
大模型技术优化负载均衡:AI驱动的智能化运维
运维·人工智能·负载均衡
新时代农民工--小明1 小时前
前端自动化部署更新,自动化打包部署
运维·前端·自动化
一个不秃头的 程序员2 小时前
服务器上加入SFTP------(小白篇 1)
运维·服务器
fnd_LN2 小时前
Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
linux·运维·服务器
MorleyOlsen2 小时前
【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
运维·服务器·深度学习
周周的奇妙编程2 小时前
基于鲲鹏服务器的打砖块小游戏部署
运维·服务器
大熊程序猿2 小时前
airflow docker 安装
运维·docker·容器
从后端到QT2 小时前
boost asio 异步服务器
服务器·网络·tcp/ip