消费者&生产者模型的python代码
2012-12-08 20:13
239 查看
引言:前几天看了一点InfoQ上大神们很多的总结,服务编程范式以这样的方式进化多进程--->多线程--->非阻塞--->协程。
说说协程,找了一些关于GreenLet的资料,协程也称作微线程,是比线程还小的一种执行体。
线程确实执行体就是一个函数,在用户空间看来,但是在内核中线程也是一个进程,LWP所谓的轻量级进程,线程也存在自己的上下文运行环境。
协程不同于线程的是,线程是抢占式的调度,而协程是协同式的调度,也就是说,协程需要自己做调度。
看看一个简单的消费者&生产者模型的python代码:
这里协程的调度是通过 send() 调用来传递任务,就是说,在producer执行期间,consumer是阻塞在 yield 表达式上。
每一次send()都会传递值给相应的任务给consumer.
总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论
比较好的开源协程库 eventlet | greenlet 等
说说协程,找了一些关于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 | "Wait to getting a task" |
13 | while 1 : |
14 | n = ( yield ) |
15 | "Got %s" ,n |
16 |
17 |
18 |
19 | import time |
20 | def producer(): |
21 | c = consumer() |
22 | while 1 : |
23 | time.sleep( 1 ) |
24 | "Send a task to consumer" |
25 | c.send( "task" ) |
26 |
27 | if __name__ = = "__main__" : |
28 | producer() |
每一次send()都会传递值给相应的任务给consumer.
总结:可以看出来,协程确实是一种轻量级的线程,调度策略取决于什么时候发送"消息"。关于其具体的实现还没有看过源码。不能妄加评论
比较好的开源协程库 eventlet | greenlet 等
相关文章推荐
- python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)
- Python之生产者&、消费者模型
- 多线程生产者与消费者问题代码模型
- python基础-进线程下的queue、及其生产者消费者模型(2种方式)
- python 生产者消费者模型
- python之生产者消费者模型
- Python 生产者和消费者模型
- 人生苦短之我用Python篇(队列、生产者和消费者模型)
- 生产者消费者模型实现<一>模拟实现
- python queue和生产者和消费者模型
- 生产者&消费者模型-线程间协调
- Python--多线程编程--生产者消费者模型
- Python自定义进程池(生产者/消费者模型)
- python生产者消费者模型
- python编写类来实现生产者消费者模型
- Python_简单的生产者消费者模型
- 多进程 队列 实现生产者消费者模型 python 笔记
- 利用python实现生产者消费者的并发模型
- 4.利用python生成器实现简单的“生产者消费者”模型
- Java线程同步:生产者-消费者 模型(代码示例)