python之生产者消费者模型实现详解
代码及注释如下
#AutherBob
#--*--conding:utf-8--*--
#生产者消费者模型,这里的例子是这样的,有一个厨师在做包子,有一个顾客在吃包子,有一个服务员在储存包子,这个服务员我们就可以用queue来实现
importthreading
importqueue
importtime
'''
defconsumer(p,que):
id=que.get()
print("[%s]来吃包子了,我吃到的包子的名字是[%s]"%(p,id))
defprodcer(p,que):
print("[%s]做了2个包子"%(p))
que.put("baozi[1]")
print("baozi[1]做好了")
que.put("baozi[2]")
print("baozi[2]做好了")
if__name__=='__main__':
que=queue.Queue()
p=threading.Thread(target=prodcer,args=("Bob",que))
c1=threading.Thread(target=consumer,args=("c1",que))
c2=threading.Thread(target=consumer,args=("c2",que))
c3=threading.Thread(target=consumer,args=("c3",que))
p.start()
c1.start()
c2.start()
c3.start()
#p.join()
'''
#上面这个例子,如果没有包子了,但是厨师会不知道,厨师也不会继续做包子,而没有吃到包子的人会一直等待,程序会一直不结束
#我们可以这样做,消费者发现没有包子了,告诉服务员,服务员在告诉厨师,这里我们就会遇到task.down
defconsumer(p):
id=que.get()
print("[%s]来吃包子了,我吃到的包子的名字是[%s]"%(p,id))
que.task_done()#如归队列为空了,则会通知que.join,que.join就不会阻塞了
"""
defprodcer(p):
whileTrue:
ifque.qsize()<3:
#time.sleep(1)
foriinrange(2):
print("[%s]做了包子[%d]"%(p,i))
que.put(i)
que.join()#如果队列一直不为空,则que.join会一直阻塞,如果队列为空,则que.join就不阻塞了
"""
defprodcer(p):
whileTrue:
#time.sleep(1)
foriinrange(2):
print("[%s]做了包子[%d]"%(p,i))
que.put(i)
que.join()#如果队列一直不为空,则que.join会一直阻塞,如果队列为空,则que.join就不阻塞了
if__name__=='__main__':
que=queue.Queue()
p=threading.Thread(target=prodcer,args=("Bob1",))
p2=threading.Thread(target=prodcer,args=("Bob2",))
c1=threading.Thread(target=consumer,args=("c1",))
c2=threading.Thread(target=consumer,args=("c2",))
c3=threading.Thread(target=consumer,args=("c3",))
c4=threading.Thread(target=consumer,args=("c4",))
c5=threading.Thread(target=consumer,args=("c5",))
c6=threading.Thread(target=consumer,args=("c6",))
p.start()
p2.start()
c1.start()
c2.start()
c3.start()
c4.start()
c5.start()
c6.start()
#p.join()
#que.task_done()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。