【发布时间】:2012-01-13 11:00:49
【问题描述】:
我读过在 CPython 中,解释器堆栈(为达到这一点而调用的 Python 函数列表)与 C 堆栈(在解释器自己的代码中调用的 C 函数列表)混合在一起。如果是这样,那么生成器和协程是如何实现的?他们如何记住他们的执行状态? CPython 是否将每个生成器/协程的堆栈复制到操作系统堆栈和从操作系统堆栈复制?还是 CPython 只是将生成器的最顶层堆栈帧保留在堆上,因为生成器只能从该最顶层帧产生?
【问题讨论】:
-
一些现有的答案和 cmets 声称 Python 维护一个与 VM 的 C 堆栈完全分离的“程序堆栈”。这种说法是错误的。查看链接:en.wikipedia.org/wiki/Stackless_Python Stackless Python 存在但不是主流。理解就是问题是对的。
-
近四年后,我意外地回答了自己,通过合着一章解释了生成器和协程是如何实现的:aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html
-
很棒的文章,非常密集。
-
不相关,但是...在不到 4 年的时间里,您是如何从询问生成器是如何实现的,到与 Guido 一起撰写有关此主题的书籍章节的? :)
-
哈!实现和维护 Motor,我的 Tornado 和 asyncio 的 MongoDB 驱动程序,意味着我在过去几年中一直在使用和思考协程。我通过阅读 CPython 源代码(比我担心的更清晰)和 Tornado 的源代码来满足我的好奇心,然后在编写 asyncio 时,我也阅读了它。另外,我想在会议上发言,这进一步促使我研究协程和异步,以便我可以就这个主题发表演讲。