Python 源码学习(5):协程
Python 源码学习(5):协程 协程 coroutine 是一种用户态的轻量级线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程;Python中的生成器 generator 就是一个典型的协程应用,本文简单地对 Python 中生成器的实现进行分析。 1 生成器 如果 Python 中的函数含有 yield 关键字,那么在调用这个函数时,它不会如同普通的函数一样运行到 return 语句并返回一个变量,而是会立即返回一个生成器对象;以一个斐波那契数列生成函数为例: def FibonacciSequenceGenerator(): a, b = 0, 1 while True: yield a + b a, b = b, a + b if __name__ == "__main__": fsg = FibonacciSequenceGenerator() print(fsg) print(type(fsg)) $ python3 main.py <generator object FibonacciSequenceGenerator at 0x7fb4720b1ac0> <class 'generator'> 可以看到函数 FibonacciSequenceGenerator 返回了一个类型为 generator 的生成器对象 f;对于生成器对象,我们不能像操作普通函数一样直接进行函数调用,而是要使用 next() 或 fsg.send() 来进行函数切换,使得生成器函数开始或继续执行,直到 yield 所在行或是函数末尾再将执行权交还给调用方: for i in range(100): print(next(fsg)) $ python3 main.py 1 2 3 5 # ... 218922995834555169026 354224848179261915075 573147844013817084101 生成器的这种行为与线程切换非常类似,它包含了执行,保存,恢复上下文的步骤,用生成器来模拟线程的行为可以避免从用户态到内核态的切换,从而提升效率。 ...