Stackless Python
Stackless Python或称简称Stackless,是一个Python编程语言解释器,这么称呼的原因是它避免了依赖C调用栈为自己的堆栈。在实际中,Stackless Python使用了C堆栈,但是这个堆栈在函数调用之间是被清除的[1]。Stackless Python的最突出特征是微线程,它避免了与操作系统线程有关的大量开销。在Python特征之外,Stackless还增加了协程、通信通道和任务序列化。
原作者 | Christian Tismer |
---|---|
開發者 | Anselm Kruis |
首次发布 | 1998年 |
当前版本 | v3.8.1-slp(2021年8月12日 | )
源代码库 | |
编程语言 | C, Python |
操作系统 | Linux, Windows |
类型 | 解释器 |
许可协议 | Python软件基金会许可证 |
网站 | github |
设计
对于Stackless Python,一个运行的程序被分解成微线程,由语言解释器自身而非操作系统内核管理,上下文切换和任务调度纯粹在解释器内完成,因而可以被视作是一种形式的绿色线程。微线程管理在同一个CPU核心上一个程序的不同子任务的执行,Stackless Python不移除Python的全局解释器锁, 也不使用多线程或多进程。所以它只允许在一个共享CPU核心上的协作式多任务而非并行,最初不能获得而现在有了某种形式的抢占[2]。
由于相当数量的源代码变更,Stackless Python不能在现存的Python安装上作为一个扩展或库来安装。它自身是完整的Python发行。大多数的Stackless Python的特征也在PyPy中实现了,它是自我寄宿的Python解释器和JIT编译器[3]。
使用
尽管整个Stackless Python是一个独立发行,它的上下文切换功能已经成功的打包为叫做greenlet的CPython扩展[4]。它被用在很多库,比如gevent[5],用来提供CPython的绿色线程解决方案。Python现在已经接受了对绿色线程的原生解决方案:async/await。
Stackless Python广泛的使用在大规模多玩家在线游戏Eve Online的实现和IronPort的邮件平台。
引用
- ^ 存档副本. [2020-09-30]. (原始内容存档于2020-08-29).
- ^ About Stackless. [26 August 2016]. (原始内容存档于2020-06-23).
a round robin scheduler is built in. It can be used to schedule tasklets either cooperatively or preemptively.
- ^ Application-level Stackless features — PyPy documentation. pypy.readthedocs.org. [2020-09-30]. (原始内容存档于2016-04-13).
- ^ greenlet: Lightweight concurrent programming — greenlet 0.4.0 documentation. greenlet.readthedocs.org. [2020-09-30]. (原始内容存档于2016-04-16).
- ^ What is gevent? — gevent 1.3.0.dev0 documentation. www.gevent.org. [2020-12-09]. (原始内容存档于2020-09-16).
参閱
外部链接
- Stackless Python Documentation for: 3.7-slp(页面存档备份,存于互联网档案馆), 3.6-slp(页面存档备份,存于互联网档案馆), 3.5-slp(页面存档备份,存于互联网档案馆), 3.4-slp(页面存档备份,存于互联网档案馆), 2.7-slp(页面存档备份,存于互联网档案馆)
- GitHub上的stackless頁面
- Multithreaded Game Scripting with Stackless Python(页面存档备份,存于互联网档案馆) by Harry Kalogirou
- Continuations and Stackless Python by Christian Tismer