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

2024-04-28 02:39:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我不完全理解,Twisted、Stackless、Greenlet、Eventlet、Coroutines都使用异步网络IO和userland线程,这些线程非常轻量级,而且切换速度很快。但我不知道他们之间有什么不同。

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

任何能帮助我理解这个话题的人都将不胜感激。


Tags: io网络进程twisted线程greenlet速度coroutines
3条回答

上钩了!(修复欢迎!)以下内容:

严重的:

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

这些进程都没有Erlang进程那么轻巧或受支持。

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

现在:

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

你在比较Stackless时几乎是对的 去格林莱特。缺少的是:

无堆垛本身并不能增加一些东西。取而代之的是,在Stackless 5年后发明的Greenlet移除了某些东西。它的编写非常简单,可以作为扩展模块而不是替换解释器来构建。

这真的很有趣Stackless有更多的特性,在切换时效率大约是原来的10倍,并且提供了执行状态的pickling。

Greenlet仍然胜出,可能只是因为它作为扩展模块的易用性。所以我想用腌制的方法来恢复这个过程。也许这会再次改变局面:-)

相关问题 更多 >