首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/Erlang: Twisted,Stackless,Greenlet,Eventlet,Coroutines有什么区别?它们类似于Erlang过程吗?

Python/Erlang: Twisted,Stackless,Greenlet,Eventlet,Coroutines有什么区别?它们类似于Erlang过程吗?
EN

Stack Overflow用户
提问于 2010-11-24 10:50:10
回答 3查看 7.3K关注 0票数 30

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

而且,它们听起来非常类似于Erlang过程。它们几乎是一回事吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-24 14:26:55

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

现在:

  • Twisted是一个经典的非阻塞I/O框架--应用程序代码是使用callbacks.
  • Geventeventlet以异步方式编写的,使用greenlet库实现协程/绿色线程/绿色小程序。有一个专用的greenlet用于运行eventloop (在gevent的情况下,它是C代码的libevent的事件循环)。当任意的greenlet开始等待某些I/O操作进行处理时,它只是将执行交给事件循环,该事件循环启动另一个greenlet以供执行(准备执行某些I/O)。这就是所谓的协作多任务--每个greenlet自己决定何时将控制权交还给其他的greenlets.
  • Stackless微线程,这些微线程类似于greenlet,但也可以使用抢占式模型进行调度--这意味着调度器可以在任何时候停止微线程的执行,并开始执行另一个微线程(这就是OS线程和Erlang进程的工作方式)。此外,Stackless没有提供任何开箱即用的非阻塞I/O工具,所以如果您通过stdlib执行I/O -它将阻塞整个OS线程,因此在您等待I/O时没有其他微线程可以执行。有人尝试为Stackless提供gevent库的端口,但我不知道它进行得如何。
票数 38
EN

Stack Overflow用户

发布于 2010-11-24 12:13:24

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

大体上:

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

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

票数 11
EN

Stack Overflow用户

发布于 2012-03-19 04:43:56

将Stackless与Greenlet进行比较时,您几乎是正确的。缺少的是:

Stackless本身并不会一些东西。取而代之的是,在Stackless之后5年发明的Greenlet删除了某些东西。它写得足够简单,可以作为扩展模块构建,而不是替换解释器。

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4263059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档