Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程之间有什么区别?它们与 Erlang 进程相似吗?

StackOverflow https://stackoverflow.com/questions/4263059

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

而且它们听起来与 Erlang 进程非常相似。它们几乎是同一件事吗?

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

有帮助吗?

解决方案

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

现在:

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

其他提示

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

粗略地:

  • 扭曲:单线程。通过使用“回调”和“延迟”惯用法实现非阻塞行为。与 Node.js 类似。
  • 格林莱特/事件莱特:使用“绿色线程”(内存部分?)来实现非阻塞 io。实际上用它们的版本修补了标准 CPython IO,因此代码仍然以阻塞/顺序的方式编写。
  • 无堆栈: http://www.stackless.com/. 。没有使用过它,看起来它添加了“微线程”和其他细节? 无堆栈示例习语
  • 协程: SO 上的协程

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

您比较无堆栈的时候几乎是正确的 到Greenlet。缺少的是:

无堆栈本身不添加的东西。相反,Greenlet,发明了无堆栈5年后,消除某些事情。这是写简单到足以被构建为一个扩展模块,而不是替代的解释。

这是非常有趣的Stackless的还有更多的功能,为约10倍于开关更有效,并提供酸洗执行状态。

Greenlet仍然获胜,可能只由于容易使用作为一个扩展模块。所以我想用酸洗延长Greenlet恢复的过程。也许这会改变图象,再次: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top