您的位置:首页 > 编程语言 > Python开发

消费者&生产者模型的python代码

2012-12-08 20:13 239 查看
引言:前几天看了一点InfoQ上大神们很多的总结,服务编程范式以这样的方式进化多进程--->多线程--->非阻塞--->协程。

说说协程,找了一些关于GreenLet的资料,协程也称作微线程,是比线程还小的一种执行体。

线程确实执行体就是一个函数,在用户空间看来,但是在内核中线程也是一个进程,LWP所谓的轻量级进程,线程也存在自己的上下文运行环境。

协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。

看看一个简单的消费者&生产者模型的python代码:

01
def
coroutine(func):
02
def
ret():
03
f
=
func()
04
f.
next
()
05
return
f
06
return
ret
07
08
09
10
@coroutine
11
def
consumer():
12
print
"Wait
to getting a task"
13
while
1
:
14
n
=
(
yield
)
15
print
"Got
%s"
,n
16
17
18
19
import
time
20
def
producer():
21
c
=
consumer()
22
while
1
:
23
time.sleep(
1
)
24
print
"Send
a task to consumer"
25
c.send(
"task"
)
26
27
if
__name__
=
=
"__main__"
:
28
producer()
这里协程的调度是通过 send() 调用来传递任务,就是说,在producer执行期间,consumer是阻塞在 yield 表达式上。

每一次send()都会传递值给相应的任务给consumer.

总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论

比较好的开源协程库 eventlet | greenlet 等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: