擅长:python、mysql、java
<p>首先,非阻塞I/O与绿色线程或协程没有任何共同之处,但它会影响它们的调度方式。</p>
<p>现在:</p>
<ul>
<li><a href="http://twistedmatrix.com/trac/" rel="noreferrer">Twisted</a>是一个典型的非阻塞I/O框架-应用程序代码使用回调以异步方式编写。</li>
<li><a href="http://gevent.org/" rel="noreferrer">Gevent</a>和<a href="http://eventlet.net/" rel="noreferrer">eventlet</a>使用<a href="http://pypi.python.org/pypi/greenlet" rel="noreferrer">greenlet</a>库进行协程/greenthreads/greenlets。有一个专门的greenlet用于运行event loop(对于gevent,它是C编码的<a href="http://monkey.org/~provos/libevent/" rel="noreferrer">libevent</a>事件循环)。当任意的greenlet开始等待处理某个I/O操作时,它只会将执行交给事件循环,事件循环会启动另一个greenlet进行执行(准备好执行某些I/O)。这被称为协作多任务-每个greenlet决定何时将控制权返回给其他greenlet。</li>
<li><a href="http://www.stackless.com/" rel="noreferrer">Stackless</a>具有类似于greenlet的微线程,但也可以使用抢占模型进行调度-这意味着调度程序可以随时停止微线程的执行并开始执行另一个微线程(这就是OS线程和Erlang进程的工作方式)。此外,Stackless不提供任何现成的非阻塞I/O设施,因此如果您通过stdlib进行I/O操作,它将阻塞整个OS线程,因此在您等待I/O时无法执行其他任务。有人试图为Stackless提供gevent库的端口,但我不知道情况如何。</li>
</ul>