【1.46】生产者消费者模型

生产包子

吃包子

1、原始模型

 1 # coding=utf-8
 2 def producer():
 3     ret = []
 4     for i in range(10000):
 5         ret.append(i)
 6     return ret
 7 
 8 def cousumer(res):
 9     for index,baozi in enumerate(res):
10         print("第%s个人,吃了%s"%(index+1,baozi+1))
11 
12 res = producer()
13 cousumer(res)
14 
15 #本来这是一个并发进行
16 #但是这里是生产完包子 才开始吃
17 #这样就会占用大量的内存,效率低
18 #应该使用生成器模型来

 吃包子:

 

# coding=utf-8
def producer():
    ret = []
    for i in range(10000):
        ret.append(i)
    return ret


def cousumer(res):
    for index, baozi in enumerate(res):
        print("第%s个人,吃了%s" % (index + 1, baozi + 1))


res = producer()
cousumer(res)

# 本来这是一个并发进行
# 但是这里是生产完包子 才开始吃
# 这样就会占用大量的内存,效率低
# 应该使用生成器模型来

#改写
def test():
    print("开始")
    yield 1
    print("22")
    yield 2
    print("33")
    yield 3
test1=test()
#这里有yield 就是生成器函数
#执行 test1 没有返回值,这里只是拿到了生成器
#执行 __next__ 才会执行下一步    这就是生成器保存状态

print (test1.__next__())  #开始 1 实现从当前状态执行到下一个yield执行完 停下

#触发 生成器运行的方法 3 种方法
#send
#next
#__next__

print(test1.send(None)) #22 2    实现从当前状态执行到下一个yield执行完 停下
#这里我们看看None在哪里
#就是在 他执行 yield 后 的返回值
#1 可以实现next 功能,     2 、可以将send 中的None  值 传给yield 然后再传给 执行yield 的返回值

# print(next(test1))    #33 3     实现从当前状态执行到下一个yield执行完 停下



def cousumer(name):
    print("我是%s,我来吃包子"%name)
    while True:
        baozi=yield
        print("%s吃[%s]"%(name,baozi))

def ducu():
    for i in range(500):
        yield "包子%s"%i

def chihuo():
    for i in range(100):
        yield "%s号吃货"%i
def maibaozi():
    a = ducu()
    chi=chihuo()
    for i in chi:
        c1 = cousumer(i)
        c1.__next__()
        for i in range(5):
            c1.send(a.__next__())
maibaozi()

 

posted @ 2016-04-02 23:06  科学小怪癖  阅读(87)  评论(0)    收藏  举报