c9-python-getting-started 系列:用 asyncio 与 async/await 编写 Python 异步操作
示例工程教程【免费下载链接】c9-python-getting-startedSample code for Channel 9 Python for Beginners course项目地址https://gitcode.com/gh_mirrors/c9/c9-python-getting-started点击查看免费下载本指南围绕more-python-for-beginners课程中「Asynchronous operations」一章展开讲解 Python 处理长时间运行操作的核心方案以 asyncio 与 异步版本示例你将掌握如何用事件循环、协程与任务并发地发起网络请求并直观看到异步代码相比同步代码带来的时间收益。为什么需要异步编程Python 中耗时操作如网络请求、磁盘 IO、API 调用会阻塞当前线程的执行流。传统的同步写法中程序必须等待一个操作完成才能开始下一个操作这被称为阻塞blocking。Python 为管理这类长时间运行的操作提供了多种选择其中asyncio是支撑异步操作的核心标准库它配套引入了两个关键语法关键字async def用于定义协程coroutine即可以挂起和恢复的异步函数await用于等待某个协程或可等待对象完成同时把控制权交还给事件循环。在 本模块 README 中官方将其定位为 cutting edge前沿特性属于 Python 开发者进阶成长的关键技能。本课程在其上一季 python-for-beginners 中没有覆盖这部分内容因此在 more-python-for-beginners 课程总览 中单独列出。环境准备创建虚拟环境并安装依赖在运行示例前需要按照 课程总览的 Setup 步骤 准备好运行环境。首先创建并激活虚拟环境# Windows python -m venv venv .\venv\Scripts\activate # Linux 或 macOS python3 -m venv venv . ./venv/bin/activate随后安装本课程所需的依赖包。仓库根目录下的 requirements.txt 内容如下aiohttp requests安装命令# Windows pip install -r requirements.txt # Linux 或 macOS pip3 install -r requirements.txt两个依赖各司其职requests是同步 HTTP 客户端供同步示例使用aiohttp是异步 HTTP 客户端配合asyncio在异步示例中发起网络请求。同步示例理解阻塞带来的时间损耗同步版本示例 sync_demo.py 展示了最直观的阻塞式写法from timeit import default_timer import requests def load_data(delay): print(fStarting {delay} second timer) text requests.get(fhttp://httpbin.org/delay/{delay}).text print(fCompleted {delay} second timer) def run_demo(): start_time default_timer() two_data load_data(2) three_data load_data(3) elapsed_time default_timer() - start_time print(fThe operation took {elapsed_time:.2} seconds) def main(): run_demo() main()代码的执行流程是严格串行的load_data(2)向http://httpbin.org/delay/2发起请求该接口会人为延迟 2 秒返回在这 2 秒内requests.get()全程阻塞程序什么都做不了第一次请求完成后才轮到load_data(3)再阻塞等待 3 秒两个请求全部完成后用timeit.default_timer()计算总耗时。由于两次请求是顺序执行的总耗时约为2 3 5秒。这正是阻塞模型的代价CPU 在等待网络响应的空隙里无事可做。异步示例用 async/await 并发执行任务异步版本示例 async_demo.py 使用asyncio重构了同样的场景from timeit import default_timer import aiohttp import asyncio async def load_data(session, delay): print(fStarting {delay} second timer) async with session.get(fhttp://httpbin.org/delay/{delay}) as resp: text await resp.text() print(fCompleted {delay} second timer) return text async def main(): # Start the timer start_time default_timer() # Creating a single session async with aiohttp.ClientSession() as session: # Setup our tasks and get them running two_task asyncio.create_task(load_data(session, 2)) three_task asyncio.create_task(load_data(session, 3)) # Simulate other processing await asyncio.sleep(1) print(Doing other work) # Lets go get our values two_result await two_task three_result await three_task # Print our results elapsed_time default_timer() - start_time print(fThe operation took {elapsed_time:.2} seconds) asyncio.run(main())与同步版本相比这段代码有几个关键差异1.async def定义协程load_data和main都用async def声明它们不再是普通函数而是协程。调用协程不会立即执行函数体而是返回一个协程对象需要被调度到事件循环中才会真正运行。2.asyncio.create_task()创建并发任务two_task asyncio.create_task(load_data(session, 2)) three_task asyncio.create_task(load_data(session, 3))create_task()会把协程包装成Task任务并立即安排进事件循环。两个任务一旦创建就会同时开始执行——2 秒延迟请求和 3 秒延迟请求并发进行而不是排队等待。3.await挂起与恢复await resp.text()等待响应体读取完成await asyncio.sleep(1)模拟在等待期间做其他工作——程序挂起 1 秒期间事件循环可以继续推进两个任务最后await two_task和await three_task收集两个任务的返回值。4.async with异步上下文管理器async with aiohttp.ClientSession() as session与async with session.get(...) as resp用于管理异步资源。与普通with不同它们的进入和退出可能涉及异步操作如建立/释放连接因此必须使用async with。5.asyncio.run(main())启动事件循环asyncio.run()是程序入口负责创建事件循环、运行main()协程直到完成然后关闭循环并清理资源。在 Python 3.7 中这是运行异步程序的推荐方式。由于两个请求并发执行总耗时从同步版的约 5 秒缩短到约 3 秒取两个请求延迟的最大值。运行异步示例时你会看到输出顺序并非严格按请求发起顺序排列这正是任务在事件循环中交错调度的表现。事件循环与任务调度的底层原理从源码结构可以梳理出 asyncio 模型的三层核心概念事件循环Event Loop由asyncio.run()创建负责轮询所有待处理的可等待对象并在某个操作完成时恢复对应的协程协程Coroutineasync def定义的函数遇到await时挂起等待条件满足后从挂起点继续任务Taskasyncio.create_task()把协程包装成独立调度的任务让多个协程在同一个事件循环内并发推进。这种协作式调度意味着只有当协程主动await挂起时控制权才会让渡给其他任务。这也是为什么await asyncio.sleep(1)之后打印Doing other work会与两个网络请求交错出现——挂起期间事件循环并没有闲着而是在推进two_task和three_task。需要注意的是asyncio解决的是IO 密集型并发问题网络、文件、数据库等待它不会让 CPU 密集型计算变快。若代码块内部没有await点事件循环无法在其中插入其他任务。同步与异步的选型建议对照两个示例可以总结出实际项目中的选型原则场景推荐方案原因脚本或小型工具请求数量少requests同步调用代码直观、调试简单阻塞开销可忽略需要并发发起大量网络请求aiohttpasyncio共享一个ClientSession任务并发执行显著缩短总耗时混合场景视瓶颈而定异步只对 IO 等待有效CPU 密集计算仍可考虑多进程异步示例中刻意复用同一个aiohttp.ClientSession()而不是每个请求单独创建会话是因为会话内部维护连接池复用连接能减少握手开销这也是异步 HTTP 编程的常见最佳实践。继续深入本模块的 README 将 asyncio 称为管理长时间运行操作的核心库并提供了微软 Learn 平台的配套教程资源。想要动手验证可以直接运行仓库中的两个脚本对比耗时差异# 先运行同步版本观察约 5 秒的总耗时 python3 more-python-for-beginners/09 - Asynchronous programming/sync_demo.py # 再运行异步版本观察约 3 秒的总耗时 python3 more-python-for-beginners/09 - Asynchronous programming/async_demo.py两个示例文件均位于 09 - Asynchronous programming 目录可直接阅读源码逐行对照。如果你希望继续进阶课程还提供了 面向对象编程、Flask AI Web 应用、Django 与 Azure 部署 等后续学习路径其中异步知识在构建 Web 服务与调用外部 API 时尤其常用。赞分享示例工程教程【免费下载链接】c9-python-getting-startedSample code for Channel 9 Python for Beginners course项目地址https://gitcode.com/gh_mirrors/c9/c9-python-getting-started点击查看免费下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

高光谱数据加载实战:从HDF5到PyTorch DataLoader的完整路径

高光谱数据加载实战:从HDF5到PyTorch DataLoader的完整路径

简介:面向使用PyTorch框架处理高光谱图像的研究者,这份资源精准解决高光谱数据在深度学习训练中批量读取与预处理的效率问题。高光谱图像通常包含数百个光谱通道,数据量庞大,因此加载策略直接影响模型训练速度与稳定性。压缩包共七…

2026/10/15 19:45:41 阅读更多 →
昇腾910B/910C 多模态模型私有化部署实战:11 个模型 + Nginx 统一 API 网关

昇腾910B/910C 多模态模型私有化部署实战:11 个模型 + Nginx 统一 API 网关

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 19:45:41 阅读更多 →
协处理器系统集成实战:架构设计、接口实现与性能调优

协处理器系统集成实战:架构设计、接口实现与性能调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 19:44:39 阅读更多 →

最新新闻

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 规划一个 PoE 角色,往往卡在装备迭…

2026/10/15 20:27:02 阅读更多 →
耦合电容选型实战:隔直通交、转折频率与材质权衡

耦合电容选型实战:隔直通交、转折频率与材质权衡

1. 耦合电容的核心任务:隔直通交背后的真实电路需求1.1 为什么放大器不能简单粗暴地直接级联先说一个很多人第一次画多级放大电路时都会踩的场景:前级用共射极放大,集电极静态电位算出来大概是8V左右,后级打算用另一个共射级&…

2026/10/15 20:27:02 阅读更多 →
论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

研究生论文的数据分析,导师批起来最常见的评语是不严谨。不严谨不是指算错,而是指没说清楚怎么分析、为什么这么分析。数据分析可以按五个层次自查,每一层都有明确的检查点。 第一层,数据质量。原始数据有没有缺失值?…

2026/10/15 20:27:02 阅读更多 →
ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

3D 打印机用 USB 线连电脑,或者反复拔插 SD 卡,几乎是每个玩打印的人都要经历的事。尤其打一个十几小时的大件,人不可能一直守在机器旁边,夜里想瞄一眼温度、看它有没有翘边、会不会堵头,都没办法。给打印机加一块 ESP…

2026/10/15 20:27:02 阅读更多 →
MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

1. 为什么到现在还在用MySQL——它不是最酷的,但它是扛事的先说结论:MySQL不是数据库里性能最强的,也不是功能最丰富的,但在绝大多数业务场景下,它依然是那个“最不操心的选择”。我见过不少团队,早期为了追…

2026/10/15 20:27:02 阅读更多 →
JMeter 5.6.2压力测试实战:从线程组到报告解读

JMeter 5.6.2压力测试实战:从线程组到报告解读

简介:Apache JMeter 5.6.2 是由 Apache 组织维护的开源纯 Java 压力测试工具,具备跨平台特性,可运行于 Windows、Linux、macOS。其用途在于模拟大量用户并发访问,评估 Web 应用、数据库、FTP 服务器等静态与动态资源的高并发稳定性…

2026/10/15 20:26:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →