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

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

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

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

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

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

01 def coroutine(func):
02     def ret():
03         = 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         = (yield)
15         print "Got %s",n
16  
17  
18  
19 import time
20 def producer():
21     = 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 等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值