我最近一直在阅读关于Stackless Python的内容,与vanilla cPython相比,它似乎有很多优点。它具有无限递归,微线程,延续等所有酷炫功能,同时比cPython更快(大约10%,如果要相信the Python wiki)和兼容用它(至少版本2.5,2.6和3.0)。
所有这些看起来好得令人难以置信。但是,TANSTAAFL,我对Python社区中的Stackless没有太大的热情,PEP 219从未实现过。这是为什么? Stackless的缺点是什么? Stackless'壁橱里隐藏着什么骨架?
(我知道Stackless不提供真正的并发性,只是一种更简单的并发编程方式。它并没有真正打扰我。)
答案 0 :(得分:156)
我不知道Wiki上的“Stackless速度快了10%”,但我再也没有尝试过这些性能数据。我无法想象Stackless能做些什么才能产生重大影响。
Stackless是一个具有多种组织/政治问题的神奇工具。
第一个来自历史。 Christian Tismer开始谈论大约10年前最终成为Stackless的事情。他知道自己想要什么,但很难解释他在做什么以及为什么人们应该使用它。这部分是因为他的背景没有关于协程等想法的CS培训,而且因为他的演讲和讨论都是面向实施的,对于那些尚未深入了解如何将其用作解决方案的人而言,这是很难的。他们的问题。
因此,初始文件很差。有一些关于如何使用它的描述,最好的来自第三方贡献者。根据PyCon调查数据,在PyCon 2007上,我发表了一篇关于“Using Stackless”的演讲,该演讲相当顺利。 Richard Tew在收集这些内容方面做得非常出色,更新了stackless.com,并在新的Python版本出现时维护了发行版。他是EVE Online的开发人员CCP Games的雇员,他使用Stackless作为游戏系统的重要组成部分。
CCP游戏也是人们在谈论Stackless时使用的最真实的例子。 Stackless的主要教程是Grant Olson的“Introduction to Concurrent Programming with Stackless Python”,它也是面向游戏的。我认为这给人们一种偏见,即Stackless是面向游戏的,而游戏更容易继续面向游戏。另一个难点是源代码。在原始形式中,它需要对Python的许多部分进行更改,这使得Python领导者Guido van Rossum变得谨慎。我认为,部分原因是对call / cc的支持,后来被删除为“当有更好的更高级别的表单时,太像支持goto”。我不确定这段历史,所以请把这段读作“Stackless曾经需要太多的改变。”
后来的版本不需要更改,Tismer继续推动将其包含在Python中。虽然有一些考虑,官方的立场(据我所知)是CPython不仅是一个Python实现,但它是一个参考实现,它不会包括Stackless功能,因为它不能由Jython实现或Iron Python。
绝对没有“对代码库进行重大更改”的计划。来自Arafangion的报价和参考超链接(见评论)大约来自2000/2001。结构变化早已完成,这就是我上面提到的。 Stackless现在已经稳定而成熟,在过去的几年中只对代码库进行了微小的调整。
Stackless的最后一个限制 - Stackless没有强烈的支持者。 Tismer现在深入参与了PyPy,这是Python for Python的一个实现。他在PyPy中实现了Stackless功能,并认为它比Stackless本身更优越,并且认为PyPy是未来的方式。 Tew维持Stackless,但他对倡导不感兴趣。我考虑过担任这个角色,但看不出我是如何从中获得收入的。
虽然如果你想要Stackless训练,请随意contact me! :)
答案 1 :(得分:37)
找到这个讨论需要很长时间。在那 那段时间我没有参加PyPy但与psyco有2年的恋情,直到健康状态突然停止了。我现在再次活跃并设计一个 替代方法 - 将在EuroPython 2012上展示。
安德鲁斯的大多数陈述都是正确的。一些 次要补充:
Stackless比10年前的CPython快得多,因为我优化了解释器循环。那时,Guido还没准备好。几年后,人们进行了类似的优化,甚至更多更好的优化,这使得Stackless的速度有点慢,正如预期的那样。
关于包容性:嗯,一开始我非常咄咄逼人,并且确信Stackless是要走的路。后来,当几乎可能被包括在内时,我对此失去了兴趣并且更愿意放弃 它保持这种方式,部分是出于挫折,部分是为了 保持对Stackless的控制。
像“其他实现无法做到”这样的论点对我来说总是很蹩脚,因为还有其他例子也可以使用这个论点。我认为我最好忘记这一点,并与Guido保持良好的友谊,拥有自己的发行版。
与此同时,情况正在发生变化。我正在研究PyPy和Stackless作为扩展,有时会讨论这个问题
干杯 - 克里斯
答案 2 :(得分:5)
如果我没记错的话,Stackless将被列入官方CPython,但stackless的作者告诉CPython人不要这样做,因为他计划对代码库做一些重大改变 - 假设他想要整合在项目更成熟时做完。
答案 3 :(得分:3)
我也对这里的答案感兴趣。我已经玩过Stackless,看起来它对标准Python来说是一个很好的补充。
如果Python想要更改为不同的堆栈,那么PEP 219确实提到了从C代码调用Python代码的潜在困难。需要有方法来检测和防止这种情况(避免破坏C堆栈)。我认为这很容易,所以我也想知道为什么Stackless必须独立存在。