Python 协程基础与 asyncio 异步编程实战
1. 协程定义与优势
协程(Coroutine)是用户态的轻量级线程,通过协作式多任务实现并发。 相比系统级线程,协程的切换无需陷入内核、无需操作系统调度,只保存/恢复寄存器上下文,代价极低(通常微秒级甚至更低)。
核心优势:
- 无锁机制:彻底避免多线程的锁、GIL 争抢、上下文切换开销
- 高并发:单线程轻松处理几千上万的 I/O 密集任务(网络、文件、数据库等)
- 代码简洁:用同步风格的语法写出异步逻辑(async/await)
2. 协程实现方式(以 asyncio 为核心)
2.1 异步基础语法
async def fetch_data():
# 异步操作
result = await some_async_func()
return result
- async def 定义协程函数
- await 只能出现在 async 函数内,表示'在这里暂停,等待结果'
2.2 async def 和 await 原理
async def不是定义'函数',而是定义一个可以暂停的协程(coroutine)。await表示:'这里我需要等一个结果,先把 CPU 让给别人用,我暂停在这儿。'
暂停后,事件循环立刻去执行其他能跑的协程。
普通函数调用会一直跑到底返回;协程则是调用 → 跑一点 → suspend(暂停) → 别人跑 → resume(恢复) → 再跑一点 → 又暂停 → …… → 最后 destroy(结束)。
2.3 事件循环与任务创建
asyncio 的心脏就是事件循环(Event Loop),它不停询问:'有哪些任务可以运行了?'
- 同步/多线程风格:一个厨师做一道菜,从头做到尾。中间切菜、煮汤时,厨师就傻站着(阻塞)。
- asyncio 风格:只有一个厨师(单线程),但他超级聪明。煮汤时水在开,他不傻站着,立刻去切菜;切菜切到一半,锅要翻炒了,他就暂停切菜去翻炒;翻炒完又回来继续切……
这个'聪明切换'的'大脑'就是 事件循环(Event Loop)。


