Python 中协程与子例程的区别
Python 中协程(Coroutine)和子例程(Subroutine/普通函数)有什么本质区别?
回答
编译有声
| 特性 | 子例程(函数) | 协程 |
|---|---|---|
| 执行方式 | 一次执行完(或被 return 终止) | 可多次暂停和恢复 |
| 状态保持 | 不保持中间状态 | 保持局部变量和执行位置 |
| 入口 | 只有一个入口(函数开始) | 多个入口(每次 resume 从上次 yield 处继续) |
| 调用者关系 | 调用者->被调用者,层次关系 | 调用者<->协程,对称关系 |
| 终止 | 一次 return | 多次 yield + 最终 return/StopIteration |
# 子例程
def add(a, b):
return a + b
# 生成器基协程
def counter():
i = 0
while True:
value = yield i # 暂停,返回 i,等待外部 send
if value is not None:
i = value
i += 1
# async 协程
async def fetch():
data = await some_async_call() # 暂停,等待异步结果
return process(data)
协程适合协作式多任务,让出控制权(yield/await)等待 I/O,而非被抢占。