PyPy中的无栈与PyPy+greenlet的区别

16 投票
1 回答
5371 浏览
提问于 2025-04-17 10:50

新的PyPy版本带来了集成的Stackless。据我所知,这个内置的Stackless和2001年推出的原版Stackless不太一样,后者有“继续执行”的功能。所以主要是提供了一种绿色线程框架和调度器。

Greenlet是Stackless的一个衍生版本,它作为一个扩展模块提供了Stackless的绿色线程功能。

使用“原生”的Stackless(来自PyPy)有什么好处吗?比起使用PyPy + greenlet加上某个调度器(比如说gevent)?或者说,我不能在PyPy中使用这些类型的扩展吗?更具体一点:我知道PyPy有自己实现的greenlet(基于continulet)。但我很好奇能否将外部的greenlet与gevent和PyPy内部的greenlet连接起来。

PyPy是否自带一个异步IO库,供Stackless使用,而不是使用标准的库?

我了解stackless本身以及其他一些异步轻线程的扩展(比如eventlet、gevent、twisted等)。所以我并不是想了解它们之间的区别,而是想知道使用内置stackless的PyPy有什么优势。

1 个回答

16

PyPy是否自带一个异步IO库,可以用来替代标准库中的Stackless?

从PyPy 2.6.1和PyPy3 2.4.0开始,你可以使用asyncio(通过pypi包)来替代Stackless中的异步功能。

使用PyPy自带的“原生”Stackless有什么好处,相比于PyPy + greenlet + 一些调度器?

除了Stackless API更丰富(比如可以对微线程进行序列化)之外,速度也是一个优势,因为调度器是用C语言写在运行时中的。基准测试应该能清楚地显示这一点。

想了解更多关于Stackless的信息,可以看看这篇文章 什么是Stackless?

撰写回答