在处理与数据预处理和网络开发相关的应用程序时,需要执行多个 HTTP 请求。在处理大量请求的情况下,使用同步请求往往效率比较低,因为每个请求都必须等待前一个请求完成。因此,这种方法会显著延迟,尤其是当向具有不同响应时间的外部 API 发出请求时效率更低。与同步请求不同,异步请求允许我们可以同时发出多个请求,这非常高效且执行速度更快。
在本文中,我们将了解如何使用 Python 发出异步 HTTP 请求。我们将使用专为 Python 中的异步操作而设计的 “aiohttp” 库。
使用 Python 的异步请求
先决条件
首先,让我们了解一下在深入研究 Asynchronous 请求之前我们应该熟悉的一些先决条件:
Python 编程语言基础知识
基本了解 HTTP 请求和 Python 库请求
熟悉 Python 中的异步编程概念,例如 “async” 和 “await”
首先安装库 “aiohttp” 和 “asyncio”。如果操作系统是 Windows,请使用 “pip”,如果操作系统是 Mac/Linux,请使用 “pip3”。
pip/pip3 install aiohttp asyncio
使用 aiohttp 进行异步请求
尽管 “requests” 库非常适合同步发出 HTTP 请求,但它不支持异步操作。因此,对于异步请求,使用 aiohttp 是 Python 中用于发出异步请求的库,因为它提供了一个易于使用的 API 来发出异步 HTTP 请求,使我们能够利用非阻塞操作。
与同步 “requests” 库不同,“aiohttp” 库专为异步操作而设计,该库的核心组件之一是 ClientSession。
什么是 aiohttp 中的 ClinetSession?
在“aiohttp”库中,核心组件“ClientSession”基本上就是一个对象,它有效地管理和重用 HTTP 连接,也减少了为每个请求创建和关闭连接的开销。此外,我们还可以使用 “ClientSession” 来发出请求,例如 GET 或 POST,这绝对可以确保会话在多个请求中保持活动状态,从而提高性能。
以下是 “ClientSession” 的工作原理步骤:
1. 创建会话:首先,首先创建 ClientSession 的实例,用于管理连接池。这基本上允许为多个请求重用连接。
2. 发出请求:在第二步中,在 session 本身中,我们可以使用 session.get、session.post 等方式发出异步请求。这些请求的执行通常不会阻塞我们程序的流程。
3. 关闭会话:在最后一步中,完成上一步后,将关闭会话以释放资源。使用 “async with” 可确保会话在使用后得到正确清理。
代码实现示例
现在,让我们考虑一个真实的例子,其中需要同时从多个 API 获取数据。以下是演示如何使用 “aiohttp” 执行此操作的代码
import aiohttp import asyncio import time async def fetch_data(session, url): print(f"Starting task: {url}") async with session.get(url) as response: await asyncio.sleep(1) # Simulating a delay data = await response.json() print(f"Completed task: {url}") return data async def main(): urls = [ 'https://api.github.com', 'https://api.spacexdata.com/v4/launches/latest', 'https://jsonplaceholder.typicode.com/todos/1' ] async with aiohttp.ClientSession() as session: tasks = [fetch_data(session, url) for url in urls] results = await asyncio.gather(*tasks) for result in results: print(result) if __name__ == '__main__': start_time = time.time() asyncio.run(main()) print(f"Total time taken: {time.time() - start_time} seconds")
输出:
使用 Python AioHttp 发出异步请求
上面的代码示例向 3 个不同的 API 发出异步请求,然后打印 JSON 响应。使用 “asyncio.gather” 可确保所有请求同时运行,并显著减少整体执行时间。
错误处理
为了确保应用程序的健壮性,异步代码中的 Hande 错误非常重要。在 “aiohttp” 库中,可以通过在异步函数中使用 “try-except” 块来找到错误。下面是一个示例:
async def fetch_data(session, url): print(f"Starting task: {url}") try: async with session.get(url) as response: response.raise_for_status() # Raise exception for HTTP errors await asyncio.sleep(1) # Simulating a delay data = await response.json() print(f"Completed task: {url}") return data except aiohttp.ClientError as e: print(f"Error fetching data from {url}: {e}") except asyncio.TimeoutError: print(f"Request to {url} timed out")
在上面的错误处理代码示例中,“fetch_data”包括对“aiohttp.ClientError“和”asyncio.TimeoutError 的将记录错误,并且 python 程序将继续执行其他任务。
结论
异步请求是提高 Python 应用程序性能的一种非常强大且非常强大的方法,尤其是在我们处理多个外部 API 调用的情况下。通过使用 aiohttp python 库,我们可以轻松实现非阻塞的 HTTP 请求,从而显著减少执行时间。通过有效处理错误,异步代码的健壮性得到了进一步增强。通过遵循本文中讨论的上述步骤,我们将轻松地在项目中实现异步请求,以提高性能和效率。