CodeWalk

Python 中协程与子例程的区别

作者:编译有声 · 2026-05-30 12:55

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,而非被抢占。