当前位置: 首页 > article >正文

使用异步编程提升Python网络请求性能

使用异步编程提升Python网络请求性能

    • 示例代码解析
      • 完整代码
      • 知识点解读
        • 1. **异步函数 (`async def`)**
        • 2. **`aiohttp`库**
        • 3. **协程的调度 (`asyncio.gather`)**
        • 4. **异常处理**
    • 异步编程的优势
      • 同步编程
      • 异步编程
    • 实验效果
    • 注意事项
    • 结论

在Python中,异步编程是一种强大的工具,尤其在处理I/O密集型任务(如网络请求)时,能够显著提高程序的性能和效率。本文将通过一个示例代码,介绍如何使用Python的asyncioaiohttp库,实现高效的异步HTTP请求。


示例代码解析

以下是示例代码,该代码演示了如何使用aiohttp库异步地获取多个URL的内容。

完整代码

import aiohttp
import asyncio
from typing import List

async def fetch_url(session: aiohttp.ClientSession, url: str) -> str:
    """异步获取URL内容"""
    try:
        print(f"开始请求: {url}")
        async with session.get(url, verify_ssl=False, timeout=30) as response:
            if response.status == 200:
                text = await response.text()
                print(f"请求成功: {url}, 内容长度: {len(text)}")
                return text
            else:
                print(f"请求失败: {url}, 状态码: {response.status}")
                return ""
    except Exception as e:
        print(f"请求异常: {url}, 错误信息: {str(e)}")
        return ""

async def main():
    """主函数"""
    urls = [
        'https://python.org',
        'https://www.baidu.com',
        'https://www.pythonav.com'
    ]
    
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        
        for url, content in zip(urls, results):
            if content:
                print(f"{url} 请求成功,内容长度: {len(content)}")

if __name__ == '__main__':
    asyncio.run(main())

知识点解读

1. 异步函数 (async def)

异步函数使用async def定义,用于编写支持异步操作的函数。在上述代码中,fetch_urlmain是两个异步函数。

2. aiohttp
  • aiohttp.ClientSession:管理HTTP会话,支持异步HTTP请求。
  • async with:确保会话资源能够自动释放,避免资源泄露。
3. 协程的调度 (asyncio.gather)
  • asyncio.gather:并行运行多个协程,并等待它们全部完成。
  • 每个fetch_url实例是一个独立的任务,gather负责调度它们并返回所有结果。
4. 异常处理

在异步函数中,使用try...except捕获异常,保证即使某个任务失败,程序仍能继续运行。


异步编程的优势

与传统的同步编程相比,异步编程具备以下优势:

  1. 并发处理:能够同时处理多个任务,而无需等待每个任务依次完成。
  2. 更高的性能:适合I/O密集型任务,例如网络请求、文件读写。
  3. 资源利用率高:通过协程切换充分利用CPU等待时间。

以下对比展示了同步和异步编程在网络请求场景中的差异:

同步编程

import requests

urls = ['https://python.org', 'https://www.baidu.com', 'https://www.pythonav.com']

for url in urls:
    response = requests.get(url)
    print(f"{url} 请求成功,内容长度: {len(response.text)}")

缺点:每次请求必须等待完成后,才能进行下一个请求,效率较低。

异步编程

使用本文示例中的代码,可以并发处理多个请求,大大减少总的运行时间。


实验效果

运行本文代码时,输出示例:

开始请求: https://python.org
开始请求: https://www.baidu.com
开始请求: https://www.pythonav.com
请求成功: https://python.org, 内容长度: 49745
请求成功: https://www.baidu.com, 内容长度: 2387
请求成功: https://www.pythonav.com, 内容长度: 1284
https://python.org 请求成功,内容长度: 49745
https://www.baidu.com 请求成功,内容长度: 2387
https://www.pythonav.com 请求成功,内容长度: 1284

可以看到,三个URL几乎同时发起了请求,最终以并发的方式快速完成任务。


注意事项

  1. SSL验证:在某些情况下,可能会遇到SSL证书验证失败的问题。本代码通过verify_ssl=False关闭SSL验证,但在生产环境中应谨慎使用。
  2. 超时时间:设置合理的超时时间(如timeout=30),防止任务长时间挂起。
  3. 异常处理:对网络错误、超时等异常进行捕获,保证程序的稳定性。

结论

本文通过示例代码,展示了如何使用Python的异步编程来提升网络请求的效率。异步编程在处理I/O密集型任务时能够充分发挥其优势,是Python程序员不可或缺的技能。通过学习asyncioaiohttp,你可以轻松实现高性能的异步任务。


http://www.kler.cn/a/417445.html

相关文章:

  • Python因为网络原因安装依赖库报错
  • 【中间件】 Kafka
  • AI大模型:DeepSeek
  • ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
  • 二、CSS笔记
  • 分析用户请求K8S里ingress-nginx提供的ingress流量路径
  • Figma入门-原型交互
  • [windows] [C++] 由变量命名引起的血案
  • Stable Diffusion 3详解
  • oracle 用户手册
  • Android电视项目焦点跨层级流转
  • CodeIgniter 如何加载多个帮助文件
  • 241130_MindNLP学习记录
  • 【大语言模型】ACL2024论文-22 大型语言模型中的自信心:探究大型语言模型生成回答的自信心与概率一致性
  • C_字符串的一些函数
  • 算法编程题-颜色交替的最短路径
  • Vue.js 组件开发:进阶技巧与最佳实践
  • pytest 通过实例讲清单元测试、集成测试、测试覆盖率
  • 网络安全开发包介绍
  • Qt问题之 “QWidget: Must construct a QApplication before a QWidget“错误
  • 700M是什么?为什么被称为黄金频段?
  • gitee:解决vs文件权限被拒问题
  • 数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
  • 华为小米苹果三星移动设备访问windows共享文件夹windows11
  • Three.js 相机视角的平滑过渡与点击模型切换视角
  • 新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型