在CPython中如何实现生成器和协程?

我已经在CPython中读到过,解释器堆栈(Python函数的列表被称为达到这一点)与C堆栈(在解释器自己的代码中调用的C函数列表)混合在一起。 如果是这样,那么如何实施发电机和协同程序? 他们如何记住他们的执行状态? CPython是否将每个生成器/协程的堆栈复制到OS堆栈? 还是CPython只是将发生器的最上面的堆栈帧保留在堆上,因为发生器只能从最上面的帧中产生?


yield指令将当前正在执行的上下文作为闭包,并将其转换为自己的活动对象。 这个对象有一个__iter__方法,它将在这个yield语句之后继续。

所以调用栈被转换成一个堆对象。


Python运行Python程序中的Python堆栈和C堆栈混在一起的概念可能会引起误解。

Python堆栈与解释器使用的实际C堆栈完全分离。 Python堆栈上的数据结构实际上是完整的Python“框架”对象(甚至可以反省并在运行时更改一些属性)。 该堆栈由Python虚拟机管理,该虚拟机本身以C运行,因此具有正常的C程序,机器级别和堆栈。

当使用生成器和迭代器时,解释器只是将相应的框架对象存储在Python程序堆栈以外的地方,并在生成器执行恢复时将其推回到那里。 这个“其他地方”是发电机对象本身。调用发电机对象上的“下一个”或“发送”方法会导致这种情况发生。


一些现有的答案和评论声称Python维护一个与VM的C栈完全分离的“程序堆栈”。 这种说法是错误的。

检查链接:http://en.wikipedia.org/wiki/Stackless_Python

无堆栈Python存在但不是主流。 理解是问题是对的。

链接地址: http://www.djcxy.com/p/161.html

上一篇: How are generators and coroutines implemented in CPython?

下一篇: Is there a reason for C#'s reuse of the variable in a foreach?