【一分钟快学】解锁 Python 异步编程的力量:掌握 async/await 语法的正确姿势

Python 中的 async/await 语法是 Python 异步编程的核心,从 Python 3.5 版本开始引入,使得编写异步代码变得更加简单和直观。

基本概念

  • 异步编程:允许程序在等待操作完成时继续执行其他任务的编程范式,非常适合处理 I/O 密集型任务,如网络请求、文件读写等。
  • async 函数 :使用 async def 定义的函数。这种函数被调用时不会立即执行,而是返回一个 awaitable 对象。
  • await 表达式 :用于暂停异步函数的执行,直到等待的 awaitable 对象完成,释放执行权给事件循环。

使用 async/await

定义异步函数

使用 async def 定义一个异步函数,函数内部可以使用 await 来调用其他异步函数或执行异步操作。

python 复制代码
import asyncio

async def fetch_data():
    print("开始获取数据...")
    await asyncio.sleep(2)  # 模拟 I/O 操作
    print("数据获取完成")
    return {'data': 123}

调用异步函数

异步函数需要在事件循环中调用。不能直接像调用普通函数那样调用异步函数。

python 复制代码
async def main():
    data = await fetch_data()
    print(data)

# Python 3.7+
asyncio.run(main())

注意点

  1. 事件循环 :理解异步编程的关键是要明白代码是如何被事件循环处理的。asyncio.run() 函数负责运行主函数,并管理事件循环。
  2. await 的使用 :只能在 async 函数内部使用 await 关键字。
  3. 阻塞操作 :避免在异步函数中使用阻塞调用。如果需要执行阻塞操作,应该使用适当的异步库,或者使用 loop.run_in_executor() 将阻塞调用委托给线程池或进程池。
  4. 并发执行 :使用 asyncio.gather() 可以并发运行多个异步任务。

示例:并发执行异步函数

python 复制代码
async def fetch_data(task_number):
    print(f"任务 {task_number}: 开始获取数据...")
    await asyncio.sleep(2)  # 模拟 I/O 操作
    print(f"任务 {task_number}: 数据获取完成")
    return {f'task_{task_number}': 123}

async def main():
    results = await asyncio.gather(
        fetch_data(1),
        fetch_data(2),
        fetch_data(3),
    )
    for result in results:
        print(result)

asyncio.run(main())

这个示例展示了如何并发执行三个异步任务,并收集它们的结果。asyncio.gather() 是并发运行多个协程的推荐方式,因为它同时启动所有协程,并等待它们全部完成。

async/await 使得异步编程在 Python 中变得非常直观和易于理解。只要记住上述的基本概念和注意点,你就能有效地利用 Python 的异步编程特性了。

相关推荐
潇凝子潇2 分钟前
在使用Nacos作为注册中心和配置中心时,如何解决服务发现延迟或配置更新不及时的问题
开发语言·python·服务发现
烛阴4 分钟前
Python 列表推导式:让你的代码更优雅、更高效
前端·python
文心快码BaiduComate4 分钟前
开工不累,双强护航:文心快码接入 DeepSeek-V3.2-Exp和 GLM-4.6,助你节后高效Coding
前端·人工智能·后端
AI小云8 分钟前
【Python与AI基础】Python编程基础:函数与参数
人工智能·python
终生都要写代码14 分钟前
Java 25 新功能和示例
后端
泉城老铁15 分钟前
springboot实现对接poi 导出excel折线图
java·spring boot·后端
white-persist31 分钟前
MCP协议深度解析:AI时代的通用连接器
网络·人工智能·windows·爬虫·python·自动化
新智元32 分钟前
谷歌杀入诺奖神殿,两年三冠五得主!世界TOP3重现贝尔实验室神话
人工智能·openai
金銀銅鐵32 分钟前
[Java] 如何自动生成简单的 Mermaid 类图
java·后端