Python异步编程是一种用于提高程序并发性能的编程方式,特别适用于I/O密集型任务(如网络请求、文件读写等)。以下是Python异步编程的核心概念和常用方法:
1. 核心概念
- 协程(Coroutine):通过
async def定义的函数,是一种可暂停和恢复的函数。协程在执行过程中遇到await关键字时会暂停,将控制权交还给事件循环,待异步操作完成后继续执行。 - 事件循环(Event Loop):异步编程的核心调度器,负责管理和调度协程的执行。它不断轮询任务,当协程等待I/O操作完成时,事件循环会切换到其他可执行的协程,实现并发效果。
- 可等待对象(Awaitable):包括协程、任务(Task)和未来对象(Future)。这些对象可以通过
await关键字等待其完成,并获取结果。
2. 关键语法
async def:用于定义异步函数(协程函数)。调用异步函数会返回一个协程对象,需通过事件循环或await关键字来执行。await:用于暂停当前协程的执行,等待一个可等待对象完成。await后面的表达式必须是可等待对象(如协程、任务或未来对象)。asyncio.run():用于启动事件循环并运行协程。它是Python 3.7+推荐的简单方式,适用于大多数场景。
3. 常用工具
asyncio.create_task():将协程封装为任务(Task),并立即加入事件循环调度。任务可以被取消、等待或加入任务组。asyncio.gather():并发运行多个协程,并等待所有协程完成。它会返回一个包含所有协程结果的列表。asyncio.sleep():模拟异步I/O操作,挂起当前协程指定的时间,允许其他协程执行。
4. 示例代码
import asyncioasync def asyncTest(name,delay): print(f"async{name} start ") await asyncio.sleep(delay) print(f"async{name} finish")async def main(): task1=asyncio.create_task(asyncTest(1,2)) task2=asyncio.create_task(asyncTest(2,3)) results=await asyncio.gather(task1,task2) print("allTask Finish")asyncio.run(main())
5. 适用场景与注意事项
- 适用场景:网络请求、文件读写、数据库操作等I/O密集型任务。异步编程可以显著提高并发性能,减少等待时间。
- 注意事项:
- 异步编程基于单线程事件循环,不适合CPU密集型任务(如大量计算)。
- 避免在异步代码中使用阻塞操作(如
time.sleep()),应使用异步替代(如asyncio.sleep())。 - 调试异步代码可能比同步代码更复杂,需熟悉事件循环和协程的执行流程。
通过合理使用异步编程,可以有效提升Python程序在I/O密集型场景下的性能和并发能力。