Python里async await语法 异步编程async/await在Python中的实现原理

Python里async await语法 异步编程async/await在Python中的实现原理
最新回答
不爱。就_滚_

2020-11-09 03:04:00

Python中async/await语法通过协程和事件循环实现异步编程,其核心机制是协作式多任务调度,适用于I/O密集型任务的高效处理。具体实现原理及工作流程如下:

1. 协程的定义与创建
  • async def声明协程函数:使用async def定义的函数会变成协程函数,调用时返回协程对象而非直接执行。例如:async def say_hello(): print("Hello") await asyncio.sleep(1) print("World")调用say_hello()会返回一个协程对象,需通过事件循环驱动执行。
2. await的挂起与控制权转移
  • 暂停当前协程:当协程遇到await时,会检查后续对象是否为可等待对象(如协程、任务、Future)。若是,当前协程挂起,控制权交还事件循环。
  • 非阻塞等待:例如await asyncio.sleep(1)会暂停协程1秒,期间事件循环可执行其他任务,1秒后恢复执行。
3. 事件循环的核心调度
  • 任务管理:事件循环是异步编程的调度中心,负责管理所有协程和任务的执行顺序。Python通过asyncio库提供事件循环实现。
  • 启动与关闭:从Python 3.7起,推荐使用asyncio.run()启动异步程序,它会自动创建、运行事件循环并在结束时关闭。例如:asyncio.run(say_hello()) # 自动管理事件循环
4. 并发执行协程的方法
  • asyncio.gather():并发运行多个协程,等待所有完成。例如:async def main(): await asyncio.gather(say_hello(), say_hello())asyncio.run(main())
  • asyncio.create_task():将协程包装为任务,手动控制执行顺序。例如:async def main(): task1 = asyncio.create_task(say_hello()) task2 = asyncio.create_task(say_hello()) await task1 await task2asyncio.run(main())
  • 并发非并行:协程的并发是通过事件循环快速切换实现的,并非真正并行(依赖单线程),适合I/O密集型任务。
5. 底层实现:生成器与状态机
  • 生成器基础:协程本质是生成器的扩展,通过yield暂停和恢复执行。async/await语法将其抽象为更高级的接口。
  • 状态机维护:协程对象内部维护执行状态,每次被调度时从上次暂停处继续。await触发状态切换时,事件循环根据Promise/Future模型处理非阻塞等待。
6. 使用注意事项
  • 避免混用同步与异步代码

    同步函数中调用协程需通过事件循环或await驱动,否则仅返回协程对象。

    错误示例:def sync_func(): say_hello() # 仅返回协程对象,不会执行

  • 阻塞操作的影响

    协程内使用同步阻塞操作(如time.sleep())会卡住事件循环,应替换为异步版本(如await asyncio.sleep())。

  • 依赖异步库

    需使用支持异步的第三方库(如aiohttp替代requests),否则无法发挥异步优势。

示例代码解析import asyncioasync def say_hello(): print("Hello") await asyncio.sleep(1) # 挂起1秒,事件循环可执行其他任务 print("World")async def main(): await asyncio.gather(say_hello(), say_hello()) # 并发执行两个协程asyncio.run(main())

执行流程

  1. asyncio.run(main())启动事件循环。
  2. main()调用gather(),将两个say_hello()协程加入事件循环。
  3. 第一个say_hello()执行到await时挂起,事件循环切换到第二个say_hello()。
  4. 1秒后,两个协程恢复执行,依次打印World。
总结
  • 优势:通过协作式调度减少I/O等待时间,提升吞吐量。
  • 限制:单线程下CPU密集型任务无性能提升,需配合多进程或异步库使用。
  • 关键点:协程定义、await挂起、事件循环调度、并发方法及底层生成器机制。