Python 协程与异步编程实战笔记
I/O 密集型场景里,同步代码最容易把时间浪费在等待上。异步编程的价值很直接:把这段等待时间拿回来,让程序在网络、文件、数据库这些地方卡住时,先去做别的事。
异步编程在做什么
它不是'更快地执行同一件事',而是尽量别让线程傻等。发起耗时操作后,程序把控制权交回事件循环,等结果准备好再继续往下跑。这样做的好处是结构更轻,线程切换也少,尤其适合高并发但单次操作不重的任务。
常见场景主要是这些:
- 高并发网络通信,比如 HTTP、WebSocket
- 大文件读写
- 数据库查询
协程是异步代码的基本单位
Python 里用 async def 定义协程函数。调用它不会立刻执行,得到的是一个协程对象。真正跑起来,要靠 await 和事件循环配合。
import asyncio
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
# 运行协程
asyncio.run(hello())
协程遇到 await 时会主动让出控制权,等被等待的操作完成后再恢复。这个切换不是线程抢占,代码也不会被拆得太碎,读起来比回调顺手得多。
多个协程一起跑
如果想并发执行多个协程,asyncio.gather() 是最常用的入口之一:
import asyncio
async def count(name):
print(f'{name} Counting...')
await asyncio.sleep(1)
print(f'{name} Counted!')
async def main():
await asyncio.gather(count('A'), count('B'), count('C'))
asyncio.run(main())
任务调度和管理
直接 await 适合顺序控制;想让协程后台跑起来,通常会把它包成 Task。这样更方便取消、超时和统一管理。


