我最近一直在阅读关于Stackless Python的内容,与vanilla cPython相比,它似乎有很多优点.它具有所有这些很酷的功能,如无限递归,微线程,延续等,同时比cPython更快(大约10%,如果相信Python维基)并与之兼容(至少版本2.5,2.6 和3.0).
所有这些看起来好得令人难以置信.但是,TANSTAAFL,我对Python社区中的Stackless没有太大的热情,而PEP 219从未实现过.这是为什么?Stackless的缺点是什么?Stackless'壁橱里藏着什么骷髅?
(我知道Stackless不提供真正的并发性,只是一种更简单的并发编程方式.它并没有真正打扰我.)
我不知道Wiki上的"Stackless快10%"来自哪里,但我再也没有尝试过测量那些性能数字.我无法想象Stackless的作用是什么才能有所作为.
Stackless是一个有着几个组织/政治问题的神奇工具.
第一个来自历史.Christian Tismer开始谈论大约10年前最终成为Stackless的事情.他知道自己想要什么,但很难解释他在做什么以及为什么人们应该使用它.这部分是因为他的背景没有关于协程等想法的CS培训,而且因为他的演讲和讨论非常注重实施,对于那些尚未深入了解如何将其用作解决方案的人来说,这很难.他们的问题.
因此,初始文档很差.有一些关于如何使用它的描述,最好的来自第三方贡献者.在PyCon 2007上,根据PyCon的调查数据,我发表了一篇关于" 使用Stackless " 的演讲.Richard Tew在收集这些内容方面做得非常出色,更新了stackless.com,并在新的Python版本出现时维护了发行版.他是EVE Online的开发者CCP Games的员工,他使用Stackless作为游戏系统的重要组成部分.
CCP游戏也是人们在谈论Stackless时使用的最真实的例子.Stackless的主要教程是Grant Olson的" 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,PyPy是Python的Python实现.他在PyPy中实现了Stackless功能,并认为它比Stackless本身更优越,并且认为PyPy是未来的方式.Tew维持Stackless,但他对倡导不感兴趣.我考虑过担任这个角色,但看不出我是如何从中获得收入的.
虽然如果您想要Stackless培训,请随时与我联系!:)
找到这个讨论花了很长时间.当时我还没上过PyPy,但与psyco有2年的恋情,直到健康状态突然停止了.我现在再次活跃并设计另一种方法 - 将在EuroPython 2012上展示.
大多数安德鲁斯的陈述是正确的.一些小的补充:
10年前,Stackless显着快于CPython,因为我优化了解释器循环.那时,Guido还没准备好.几年后,人们进行了类似的优化,甚至更多更好的优化,这使得Stackless像预期的那样有点慢.
关于包容:嗯,一开始我非常咄咄逼人,并且确信Stackless是要走的路.后来,当几乎可能被包括在内时,我对此失去了兴趣并且倾向于让它保持这种状态,部分是出于挫折,部分是为了控制Stackless.
像"其他实现无法做到"这样的论点对我来说总是很蹩脚,因为还有其他例子也可以使用这个论点.我想我最好忘记这一点并与Guido保持良好的友谊,拥有自己的发行版.
与此同时,情况又在发生 我正在研究PyPy和Stackless作为扩展,有时候会讨论这个问题
干杯 - 克里斯
如果我没记错的话,Stackless将被列入官方CPython,但stackless的作者告诉CPython人不要这样做,因为他计划对代码库进行一些重大改变 - 假设他希望以后完成集成.该项目更加成熟.