尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

SAP固定资产减值与增值配置实操指南

SAP固定资产减值与增值配置实操指南

简介:本资源是一份面向SAP财务顾问与企业资产管理人员的实操型配置手册,聚焦固定资产减值与增值在SAP系统中的合规落地,解决市场价值波动下账面价值调整难、账务处理逻辑不清、后台配置易出错等实际问题。手册系统梳理三种主流实现方式&#…

📅 2026/10/15 19:40:03
【粉丝福利社】神券福利,实测有效,附攻略

【粉丝福利社】神券福利,实测有效,附攻略

新人按步骤领取:

📅 2026/10/15 19:40:03
Linux系统篇--重定向与文件操作命令

Linux系统篇--重定向与文件操作命令

Linux系统篇–重定向与文件操作命令 系列文章目录 Linux系统篇--常用指令 Linux系统篇--重定向与文件操作命令(本篇)前言 在上一篇文章中,我们掌握了 pwd、ls、cd、mkdir、touch、rm 等一批最基础的指令,学会了在文件系统里“定位…

📅 2026/10/15 19:40:03
MORE NEWS

更多资讯

📰

STM32F103C8T6 控制 L298N 驱动直流电机:从接线到PWM调速与闭环避坑指南

简介:这份资源面向STM32入门与电机控制初学者,围绕STM32F103C8T6通过L298N双H桥驱动两个直流电机实现正转、反转与停止的完整方案展开,配套可直接参考的工程代码,帮助读者快速理解GPIO输出控制与电机驱动之间的配合逻辑。资源包共…

📰

Vue3+Vant4移动端部门树实战:递归组件与懒加载性能优化解析

简介:面向移动端开发者的H5部门树展示示例包,定位在企业内部管理系统、协作平台等场景下的组织架构与员工层级呈现,帮助前端工程师快速实现跨手机、平板的树形列表交互。压缩包共含十一个文件,其中包括一个HTML入口、两个JavaScri…

📰

干扰消除实战指南:从物理根源到算法落地的全栈工程方法

1. 项目概述:为什么“干扰消除”不是锦上添花,而是信号链的生死线 你有没有遇到过这样的场景:实验室里刚搭好的射频接收前端,示波器上信号波形清晰漂亮,但一接入ADC做频谱分析,底噪突然抬高15dB&#xff0c…

📰

2026跨境电商英语口语APP哪个好?天花板级「咕噜口语」,一个音差一个价

本文为【跨境电商英语口语App】专项实测内容。本次测评综合参考发音纠音精度、对话响应速度、场景与跨境业务贴合度、跟读体验等维度,实测综合推荐 TOP1 为【咕噜口语 SpeakGuru】,综合推荐度【9.6/10(★★★★★)】,核…

📰

Osip SIP协议栈实战:从源码编译到事务状态机调试

简介:本资源是一套基于Osip开源SIP库的完整通信开发示例,面向网络协议开发者、VoIP应用初学者及嵌入式通信方向学习者,聚焦SIP信令交互核心能力训练。包内含166个文件,涵盖112个头文件(h)用于接口声明与结构…

📰

两节串联磷酸铁锂电池主动均衡方案:升压控制器+低功耗MCU实现能量转移

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬