Python Async/Await的使用

博主遇到使用Python标准库asyncio中async/await的程序,因之前不太了解,在网上查到一篇介绍细致的博文,并分享其链接https://zhuanlan.zhihu.com/p/27258289 。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个使用Python标准库当中asyncio中async/await的程序,之前没有太了解,在网上查了一下,发现一篇介绍的很细致的博文,在这里[分享并mark一下]。(https://zhuanlan.zhihu.com/p/27258289)

<think>我们正在处理关于Pythonasync/await使用教程和示例的请求。根据提供的引用内容,我们可以整合出一个清晰的教程,包括基本概念、语法和示例代码。 步骤: 1. 介绍asyncawait的基本概念:它们是用于异步编程的关键字,允许程序在等待I/O操作时执行其他任务。 2. 解释async:用于声明一个函数为协程(coroutine)。 3. 解释await:用于暂停当前协程的执行,等待一个awaitable对象(如另一个协程)完成,并返回结果。 4. 提供示例代码:使用引用[2]中的示例,展示如何定义协程函数以及如何使用await调用它们。 5. 运行事件循环:使用asyncio.run()来运行主协程。 注意:引用[1][3][4][5]提供了补充信息,如异步编程的优势、与旧式协程(使用@asyncio.coroutine装饰器)的区别,以及如何检查协程函数等。 我们将按照以下结构组织回答: - 什么是异步编程? - asyncawait关键字的作用 - 一个简单的示例(展示定义和调用协程) - 如何运行异步程序 - 注意事项 然后,根据指令,生成相关问题。 由于用户要求的是教程和示例,我们将重点放在解释和代码示例上。</think>### Python async/await 使用教程 #### 一、核心概念 1. **异步编程** 程序在等待 I/O 操作(如网络请求、文件读写)时不会阻塞,而是继续执行其他任务,显著提升并发性能[^1]。 2. **async** 用于声明协程函数(coroutine),替代传统的 `@asyncio.coroutine` 装饰器: ```python async def my_coroutine(): # 声明协程函数 ... ``` 3. **await** 暂停当前协程的执行,等待异步操作完成: ```python result = await some_async_task() # 等待异步任务完成 ``` > 注意:`await` 只能用于 `async` 函数内部[^4] --- #### 二、基础示例 ```python import asyncio async def fetch_data(): print("⌛ 开始网络请求") await asyncio.sleep(2) # 模拟网络延迟 print("✅ 数据获取完成") return {"data": 42} async def main(): print("🏁 启动主协程") result = await fetch_data() # 等待协程完成 print(f"📊 结果: {result}") print("🏁 主协程结束") # 运行入口 asyncio.run(main()) ``` **输出顺序**: ``` 🏁 启动主协程 ⌛ 开始网络请求 (等待2秒) ✅ 数据获取完成 📊 结果: {'data': 42} 🏁 主协程结束 ``` --- #### 三、并发执行多个任务 ```python async def task_A(): await asyncio.sleep(1) return "A完成" async def task_B(): await asyncio.sleep(2) return "B完成" async def main(): # 同时启动两个任务 task1 = asyncio.create_task(task_A()) task2 = asyncio.create_task(task_B()) # 等待所有任务完成 results = await asyncio.gather(task1, task2) print(f"结果: {results}") # 输出: ['A完成', 'B完成'] asyncio.run(main()) ``` > 总执行时间 ≈ 2秒(而非1+2=3秒),因任务并行执行[^2] --- #### 四、关键注意事项 1. **协程不直接执行** 调用协程函数仅返回协程对象,需通过 `await` 或 `asyncio.run()` 触发执行 ```python coro = fetch_data() # 错误:不会执行 await coro # 正确:实际执行 ``` 2. **事件循环要求** 异步代码必须在事件循环中运行: ```python # 正确方式 asyncio.run(main()) # 错误方式(在同步环境直接调用) main() ``` 3. **可等待对象类型** `await` 支持三种对象: - 协程(`async def` 创建) - asyncio.Task 对象 - 实现 `__await__()` 方法的对象[^5] --- #### 五、实际应用场景 1. 高并发网络服务(Web 服务器/API) 2. 爬虫程序(并行处理多个网页请求) 3. 数据库批量操作 4. 实时数据处理管道 > 当程序受限于 I/O 等待时,异步编程通常可获得 3-10 倍的性能提升[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值