Python 异步:asyncio 基础使用指南

1. 异步编程核心概念
  • 事件循环:异步程序的核心引擎,负责调度和执行协程
  • 协程 (Coroutine):通过 async def 定义的异步函数,用 await 挂起非阻塞操作
  • 任务 (Task):对协程的封装,由事件循环调度执行
  • Future:低层级对象,表示异步操作的最终结果
2. **基础语法结构
import asyncio

# 定义协程
async def say_after(delay, message):
    await asyncio.sleep(delay)  # 非阻塞等待
    print(message)

# 主协程
async def main():
    print("开始执行")
    
    # 创建任务并发执行
    task1 = asyncio.create_task(say_after(1, "你好"))
    task2 = asyncio.create_task(say_after(2, "世界"))
    
    # 等待任务完成
    await task1
    await task2
    
    print("执行结束")

# 启动事件循环
asyncio.run(main())

3. 关键API解析
  • asyncio.run(coro):启动事件循环的入口函数
  • asyncio.create_task(coro):将协程包装为任务并调度
  • asyncio.sleep(delay):异步延时(不阻塞线程)
  • asyncio.gather(*tasks):并发运行多个任务
async def concurrent_tasks():
    results = await asyncio.gather(
        task_coroutine(1),
        task_coroutine(2),
        task_coroutine(3)
    )
    print(f"结果集: {results}")

4. **异步I/O操作示例
async def fetch_data(url):
    reader, writer = await asyncio.open_connection(url, 80)
    request = f"GET / HTTP/1.1\r\nHost: {url}\r\n\r\n"
    writer.write(request.encode())
    await writer.drain()
    
    data = await reader.read(1000)
    writer.close()
    return data.decode()

async def main():
    data = await fetch_data("example.com")
    print(f"收到 {len(data)} 字节数据")

5. 最佳实践要点
  1. 避免阻塞调用:在协程内禁用 time.sleep() 等阻塞操作
  2. 任务管理:使用 asyncio.TaskGroup() (Python 3.11+) 管理任务生命周期
  3. 错误处理:通过 try/except 捕获协程内的异常
  4. 资源释放:用 async with 管理异步上下文(如网络连接)
6. **同步 vs 异步性能对比
# 同步版本(耗时约6秒)
def sync_version():
    time.sleep(2)
    time.sleep(4)

# 异步版本(耗时约4秒)
async def async_version():
    task1 = asyncio.create_task(asyncio.sleep(2))
    task2 = asyncio.create_task(asyncio.sleep(4))
    await task1
    await task2

关键总结

  • 使用 async/await 声明协程
  • 通过 asyncio.run() 启动事件循环
  • create_task() 实现并发执行
  • I/O密集型场景性能提升显著
  • 避免在协程中混用同步阻塞代码
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐