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

Con*_*ion 30 python erlang asynchronous nonblocking python-stackless

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

它们听起来与Erlang进程非常相似.它们几乎是一回事吗?

任何能够帮助我更多地理解这个主题的人都将不胜感激.

and*_*opp 37

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

现在:

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

  • Twisted还允许在不使用回调和状态机的情况下编写异步代码,通过`twisted.internet.defer.inlineCallbacks`装饰器,这将使程序员能够使用基于生成器(`yield`)的协程来实现比回调更加可读的代码. (3认同)

Gre*_*ind 11

诱饵!(修复欢迎!):

眼观:

  • 扭曲:单螺纹.通过使用'回调'和'延迟'成语来实现非阻塞行为.与node.js相似
  • greenlet/eventlet:使用'green threads'(内存部分?)来实现非阻塞io.实际上使用它们的版本修补标准CPython IO,因此代码仍然被编写为阻塞/顺序.
  • stackless:http: //www.stackless.com/.没有使用它,看起来它添加'微线程'和其他细节? 无堆语例句成语
  • 协程:关于SO的协同 程序

这些都不像Erlang进程那样轻松或受到良好支持.


小智 9

将Stackless与Greenlet进行比较时,你几乎是对的.缺少的是:

Stackless本身不会添加任何东西.相反,在Stackless之后5年发明的Greenlet删除了某些东西.它写得很简单,可以构建为扩展模块而不是替换解释器.

这非常有趣 - Stackless具有更多功能,切换效率提高了约10倍,并提供了执行状态的腌制.

Greenlet仍然获胜,可能仅仅是因为作为扩展模块的易用性.所以我正在考虑通过使用酸洗来扩展Greenlet来恢复这个过程.也许那会改变画面,再次:-)