原文地址:http://www.cnblogs.com/Bozh/archive/2012/05/31/2528302.html
引言:前几天看了一点InfoQ上大神们很多的总结,服务编程范式以这样的方式进化多进程--->多线程--->非阻塞--->协程。
说说协程,找了一些关于GreenLet的资料,协程也称作微线程,是比线程还小的一种执行体。
线程确实执行体就是一个函数,在用户空间看来,但是在内核中线程也是一个进程,LWP所谓的轻量级进程,线程也存在自己的上下文运行环境。
协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。
看看一个简单的消费者&生产者模型的python代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
def
coroutine(func): def
ret(): f
= func() f. next () return
f return
ret @coroutine def
consumer(): print
"Wait to getting a task" while
1 : n
= ( yield ) print
"Got %s" ,n import
time def
producer(): c
= consumer() while
1 : time.sleep( 1 ) print
"Send a task to consumer" c.send( "task" ) if
__name__ = =
"__main__" : producer() |
这里协程的调度是通过 send() 调用来传递任务,就是说,在producer执行期间,consumer是阻塞在 yield 表达式上。
每一次send()都会传递值给相应的任务给consumer.
总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论
比较好的开源协程库 eventlet | greenlet 等