原文地址是:
http://fxck.it/2012/07/07/%E5%B9%B6%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/----Overview----
有几个与并发有关的概念,它们分别是: 多进程 多线程 微线程 协程 纤程。
其中,协程,其实就是纤程的别称,也是微线程的别称。协程有时也被叫做用户态线程。
一个进程可以包括多个线程,一个线程可以包括多个协程。
进程的切换开销比线程大,线程的比协程大。
进程和线程都不懂的话,就不用再看下去了。而协程是最近很火的一个概念。代表技术就是Python的gevent咯。
某些文章说道:
记得N年前看过一篇论文说服务器的发展是多进程=>多线程=>异步=>协程
References:
http://blog.csdn.net/chgaowei/article/details/7237673http://gashero.iteye.com/blog/442177http://www.tumblr.com/tagged/coroutine?before=1330310936----各门语言与特定的实现----
Node.js的并发性能很好,不过它不是利用了线程或协程。它就是上面所说的那个发展过程中的异步:将每个事件都绑定一个函数,事件被触发时自动调用。属于异步I/O。
Go的goroutine据说比较接近协程。但与协程和线程的概念都不是很像,所以一般不翻译这个goroutine这个词。
Python的yield就是协程的一种实现。但我不懂Stackless到底在这之上还做出了什么改变,或许是Python的yield所提供的功能实在太简单,所以Stackless提供了更多与协程有关的API。
有资料说Ruby的yield是种简单的协程,?只适合简单的两个程序间的合作。而Fiber库对于协程的支持就比较好了。
----Python相关的一些库----
twisted, gevent, greenlet, envetlet.
twisted跟Node.js一样。官网介绍是:Twisted is an event-driven networking engine written in Python。
event-driven就是事件驱动了嘛。
gevent的介绍是:gevent based on greenlet and libevent.
greenlet是greenlet is a spin-off of Stackless。这么说greenlet来自Stackless,是Stackless的一个子集。
libevent,由名字判断是C语言的某个Linux下的库。介绍是:Currently, libevent supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4).
greenlet应该是libevent的一个Python包装(我猜的)。
eventlet会被拿来与gevent直接比较,见:http://ampzaa.blog.163.com/blog/static/14086966620104912833465/
所以他们应该是两个不同的Python协程库。
End