2019年1月2日 生产者消费者模型 元旦快乐

enumerate 用法:对序列做下标

l=['q','s','d']
for i in enumerate(l,start=2):
    print (i)
for x,y in enumerate(l,start=5):
    print(x,y)

(2, 'q')
(3, 's')
(4, 'd')
5 q
6 s
7 d

yield 和 send 特性

def test():
    print("a")
    re=yield 1 # 1 代表的是return 1,可以不填,则返回none;re代表的是函数中的局部变量
    print('b',re)
    yield 2
    print("c")
    yield 3

#yield 相当于return,控制的是函数的返回值
#yield 另一个特性,接收send传递过来的值,赋值给x

t=test() #拿到了生成器函数,但是并未运行,是否为生成器函数解释器通过yield自动判别
res=t.__next__()
print('_next_方法:',res)
res2=t.send('I am value')#send和next的执行很像,只是send可以和生成器互动,传入一个值,将需要传递对值,传递上一个yield
print('send方法:',res2)
res3=next(t)
print('next函数方法:',res3)

第1个人,吃了包子1
第2个人,吃了包子2
第3个人,吃了包子3
第4个人,吃了包子4
第5个人,吃了包子5
a
_next_方法: 1
b I am value
send方法: 2
c
next函数方法: 3

 

import time

baozi=['包子%s'%(i+1) for i in range(5)] #生产包子
def customer (res):
    #吃包子顾客
    for index,bz in enumerate(res,start=1):
        time.sleep(0.1)
        print('第%s个人,吃了%s'%(index,bz))#吃包子
customer(baozi)


#并行方法吃包子,单线程内并发

def ch(name):
    print('我是%s,我要吃包子'%name)
    while True:
        bz=yield
        time.sleep(0.2)
        print("%s吃的是%s"%(name,bz))

def chibaozi(name,xian):
    c1 = ch(name)
    c1.__next__()
    for i in range(10):
        time.sleep(0.2)
        c1.send(xian+"%s"%i) #send 传递给上面的yield

chibaozi("sxj",'肉包')

第1个人,吃了包子1
第2个人,吃了包子2
第3个人,吃了包子3
第4个人,吃了包子4
第5个人,吃了包子5
我是sxj,我要吃包子
sxj吃的是肉包0
sxj吃的是肉包1
sxj吃的是肉包2
sxj吃的是肉包3
sxj吃的是肉包4
sxj吃的是肉包5
sxj吃的是肉包6
sxj吃的是肉包7
sxj吃的是肉包8
sxj吃的是肉包9

 

posted @ 2019-01-01 20:39  小圣庄  阅读(121)  评论(0编辑  收藏  举报