切换语言为:繁体
Python 实现异步 HTTP 请求

Python 实现异步 HTTP 请求

  • 爱糖宝
  • 2024-09-09
  • 2045
  • 0
  • 0

    在处理与数据预处理和网络开发相关的应用程序时,需要执行多个 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 实现异步 HTTP 请求

使用 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 请求,从而显著减少执行时间。通过有效处理错误,异步代码的健壮性得到了进一步增强。通过遵循本文中讨论的上述步骤,我们将轻松地在项目中实现异步请求,以提高性能和效率。

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.