Python异步编程:深入理解协程的原理与实践指南

news2025/7/26 22:17:22

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

在这里插入图片描述

💖The Start💖点点关注,收藏不迷路💖

📒文章目录

  • Python异步编程-协程:现代高并发解决方案
    • 1. 同步与异步编程基础
      • 1.1 什么是同步编程的局限性?
      • 1.2 异步编程的核心思想
    • 2. Python协程的核心概念
      • 2.1 从生成器到协程的演进
      • 2.2 async/await语法详解
      • 2.3 协程的状态管理
    • 3. asyncio框架深度解析
      • 3.1 事件循环架构
      • 3.2 核心组件实战
      • 3.3 高级特性
    • 4. 协程编程模式与最佳实践
      • 4.1 常见设计模式
      • 4.2 错误处理
      • 4.3 性能优化
    • 5. 真实场景应用
      • 5.1 高并发爬虫
      • 5.2 微服务通信
      • 5.3 异步数据库
    • 6. 调试与测试
      • 6.1 调试技巧
      • 6.2 单元测试
    • 7. 总结


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python异步编程-协程:现代高并发解决方案

Python异步编程通过协程(Coroutine)提供了一种高效处理I/O密集型任务的方式,避免了传统多线程的资源消耗问题。随着asyncio库的成熟和Python对async/await语法的原生支持,协程已成为现代Python开发的重要范式。


1. 同步与异步编程基础

1.1 什么是同步编程的局限性?

  • 阻塞式I/O导致的性能瓶颈:同步代码在执行网络请求或文件读写时会阻塞线程,导致CPU空转。例如:
    import requests
    responses = [requests.get(url) for url in urls]  # 每个请求阻塞主线程
    
  • 多线程的资源竞争与GIL限制:Python的全局解释器锁(GIL)使多线程无法真正并行,且线程切换开销大。
  • 典型案例:串行处理100个HTTP请求可能需要10秒,而异步可能仅需1秒。

1.2 异步编程的核心思想

  • 事件循环(Event Loop):持续检测并执行就绪的任务,单线程内实现任务调度。
  • 非阻塞I/O:通过操作系统级通知(如epoll)实现I/O操作不阻塞线程。
  • 协程优势:一个线程内可运行多个协程,切换成本仅需几微秒(线程切换需毫秒级)。

2. Python协程的核心概念

2.1 从生成器到协程的演进

  • yield基础:生成器通过yield暂停执行并返回数据:
    def gen():
        yield 1
        yield 2
    
  • PEP 342:生成器支持.send()方法,允许双向通信,成为协程雏形。
  • yield from:简化嵌套生成器的调用,为async/await铺路。

2.2 async/await语法详解

  • 定义协程async def标记的函数返回协程对象,调用时不会立即执行:
    async def fetch():
        return "data"
    coro = fetch()  # 此时协程处于CREATED状态
    
  • await机制:挂起当前协程,直到被等待的协程完成:
    async def main():
        result = await fetch()  # 挂起直到fetch完成
    

2.3 协程的状态管理

  • 四种状态:通过inspect.getcoroutinestate()可查看:
    import inspect
    print(inspect.getcoroutinestate(coro))  # 输出状态如RUNNING
    

3. asyncio框架深度解析

3.1 事件循环架构

  • 基本使用
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())  # 启动事件循环
    
  • 平台差异:Windows默认使用Proactor(基于IOCP),Unix使用Selector(基于epoll)。

3.2 核心组件实战

  • Task与Future
    task = asyncio.create_task(fetch())  # 将协程包装为Task
    future = loop.create_future()       # 手动创建Future
    
  • 并发控制gather按顺序返回结果,wait可设置超时:
    results = await asyncio.gather(*tasks)  # 所有任务完成后返回
    done, pending = await asyncio.wait(tasks, timeout=2)
    

3.3 高级特性

  • 信号量示例:限制并发数为3:
    sem = asyncio.Semaphore(3)
    async with sem:  # 超过3个协程将在此等待
        await fetch()
    

4. 协程编程模式与最佳实践

4.1 常见设计模式

  • 扇出/扇入:多个子任务并发执行后合并结果(如爬虫分页抓取)。
  • 生产者-消费者:使用asyncio.Queue实现异步任务队列。

4.2 错误处理

  • 异常捕获:协程内未捕获的异常会传播到调用者:
    try:
        await risky_operation()
    except Error as e:
        print(f"Caught: {e}")
    

4.3 性能优化

  • uvloop:替换默认事件循环可提升2-4倍性能:
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
    

5. 真实场景应用

5.1 高并发爬虫

async with aiohttp.ClientSession() as session:
    async with session.get(url) as resp:
        return await resp.text()

5.2 微服务通信

  • gRPC异步调用:通过async/await实现非阻塞RPC。

5.3 异步数据库

conn = await asyncpg.connect(dsn)
rows = await conn.fetch("SELECT * FROM table")

6. 调试与测试

6.1 调试技巧

启用调试模式:

asyncio.run(coro, debug=True)  # 显示详细堆栈

6.2 单元测试

@pytest.mark.asyncio
async def test_fetch():
    result = await fetch()
    assert result == "data"

7. 总结

  • 核心价值:单线程内实现高并发,资源利用率提升显著。
  • 学习路径:从asyncio.run()开始,逐步掌握Task和Future。
  • 未来趋势:Python 3.11的TaskGroup将简化并发任务管理。

🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The Start💖点点关注,收藏不迷路💖

          <div align="center"><font color="#E73B3E"><em>💖The Start💖点点关注,收藏不迷路💖<em></em></em></font></div>
        </td>
    </tr>
    </tbody>
</table>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.

报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符&#xff0c;最后运行&#xff1a;npm run lint --fix

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中&#xff0c;点击确定 这是最终结果&#xff0c;但是由于环境启不了&#xff0c;这里用的是自己的excel&#xff0c;真实的环境中的excel根据实训…

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…

使用ch340继电器完成随机断电测试

前言 如图所示是市面上常见的OTA压测继电器&#xff0c;通过ch340串口模块完成对继电器的分路控制&#xff0c;这里我编写了一个脚本方便对4路继电器的控制&#xff0c;可以设置开启时间&#xff0c;关闭时间&#xff0c;复位等功能 软件界面 在设备管理器查看串口号后&…

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解

在我的上一篇博客&#xff1a;基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目&#xff0c;该项目展示了一个强大的框架&#xff0c;旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人&#xff0c;更是一个集…

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…