Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程有啥区别?它们是不是类似于 Erlang 进程?

Posted

技术标签:

【中文标题】Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程有啥区别?它们是不是类似于 Erlang 进程?【英文标题】:Python/Erlang: What's the difference between Twisted, Stackless, Greenlet, Eventlet, Coroutines? Are they similar to Erlang processes?Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程有什么区别?它们是否类似于 Erlang 进程? 【发布时间】:2011-05-14 20:46:49 【问题描述】:

我的不完全理解是,Twisted、Stackless、Greenlet、Eventlet、Coroutines 都使用了非常轻量级和快速切换的异步网络 IO 和用户态线程。但我不确定它们之间有什么区别。

它们听起来也与 Erlang 进程非常相似。它们几乎是一样的吗?

任何可以帮助我更多地理解这个主题的人将不胜感激。

【问题讨论】:

【参考方案1】:

上钩了! (欢迎修复!):

粗略:

twisted:单线程。通过使用“回调”和“延迟”习语实现非阻塞行为。类似于 node.js。 greenlet / eventlet:使用“绿色线程”(内存段?)来实现非阻塞 io。实际上用它们的版本修补了标准的 CPython IO,所以代码仍然被编写成好像它是阻塞/顺序的。 无堆栈:http://www.stackless.com/。没用过,好像增加了“微线程”和其他细节? stackless example idioms 协程:coroutines on SO

这些都不像 Erlang 进程那样轻巧或得到很好的支持。

【讨论】:

Twisted 本身不是单线程的,它对线程和线程池具有一流的支持。此外,(至少)它的数据库 API 默认使用线程。 (另外,请参阅我对 andreypopp 的答案的评论) 另外,正如 andreypopp 所说,greenlets 与非阻塞 IO 无关——两者是正交的。【参考方案2】:

首先,非阻塞 I/O 与绿色线程或协程没有任何共同之处,但它会影响它们的调度方式。

现在:

Twisted 是一个经典的非阻塞 I/O 框架——应用程序代码是使用回调以异步方式编写的。 Gevent 和 eventlet 将 greenlet 库用于协程/greenthreads/greenlets。有一个专用的greenlet 用于运行事件循环(如果是gevent,它是C 编码的libevent 的事件循环)。当任意 greenlet 开始等待某个 I/O 操作处理时,它只是将执行交给事件循环,该循环启动另一个 greenlet 执行(准备执行一些 I/O)。这称为协作多任务处理——每个 greenlet 自行决定何时将控制权交还给其他 greenlet。 Stackless 有 tasklet,它类似于 greenlets,但也可以使用抢占式模型进行调度——这意味着调度程序可以随时停止 tasklet 执行并开始执行另一个 tasklet(这就是 OS 线程和 Erlang 进程的工作方式)。此外,Stackless 不提供任何开箱即用的非阻塞 I/O 设施,因此如果您通过 stdlib 进行 I/O - 它会阻塞整个 OS 线程,因此在您等待 I/O 时没有其他 tasklet 可以执行/O。已经尝试为 Stackless 提供 gevent 库的端口,但我不知道进展如何。

【讨论】:

Twisted 还允许通过 twisted.internet.defer.inlineCallbacks 装饰器在不使用回调和状态机的情况下编写异步代码,这将使程序员能够使用基于生成器 (yield) 的协程来实现比使用更易读的代码回调。 有一个专用的 greenlet 用于运行 eventloop(...) 最多只能有一个 greenlet 拥有自己的 eventloop,这基本上可以使这些 eventloops 合作?【参考方案3】:

比较 Stackless 时,您几乎是对的 到格林莱特。缺少的是:

Stackless 本身并没有添加什么东西。相反,在 Stackless 5 年后发明的 Greenlet 删除了某些东西。它的编写很简单,可以构建为扩展模块而不是替代解释器。

这真的很有趣——Stackless 有更多的功能,切换效率提高了大约 10 倍,并提供了执行状态的酸洗。

Greenlet 仍然胜出,这可能只是因为它易于用作扩展模块。所以我正在考虑通过用酸洗扩展 Greenlet 来恢复这个过程。也许这会再次改变情况:-)

【讨论】:

以上是关于Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程有啥区别?它们是不是类似于 Erlang 进程?的主要内容,如果未能解决你的问题,请参考以下文章

与项目欧拉速度比较:C vs Python与Erlang vs Haskell

Go/Python/Erlang编程语言对比分析及示例

Go/Python/Erlang编程语言对比分析及示例

8.Twisted 多线程

Twisted 综述

您如何通过 Python(而不是通过 Twisted)运行 Twisted 应用程序?