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

同样,它们听起来与Erlang过程非常相似。他们几乎是同一回事吗?

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

最佳答案

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

现在:

  • Twisted是一个经典的非阻塞I/O框架-应用程序代码使用回调以异步方式编写。
  • Geventeventletgreenlet库用于协程/greenthreads/greenlets。有一个专用的greenlet用于运行eventloop(在gevent的情况下,它是C编码的libevent的事件循环)。当任意的greenlet开始等待某些I/O操作进行处理时,它只是将执行交给事件循环,该事件循环将启动另一个greenlet进行执行(准备执行某些I/O)。这称为协作多任务处理-每个Greenlet自行决定何时将控制权还给其他Greenlet。
  • Stackless具有类似于greenlet的小任务,但也可以使用抢先模型进行调度-这意味着调度程序可以随时停止执行该小任务并开始执行另一个小任务(这是OS线程和Erlang进程的工作方式) 。另外,Stackless不提供开箱即用的任何非阻塞I/O功能,因此,如果您通过stdlib进行I/O,它将阻塞整个OS线程,因此在等待I时,其他tasklet无法执行。/O。已经尝试为Stackless提供gevent库的端口,但是我不知道它的运行情况。
  • 关于python - Python/Erlang : What's the difference between Twisted, Stackless,Greenlet,Eventlet,协程?它们类似于Erlang流程吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4263059/

    10-12 22:41