#生产者模式和消费者模式
#定义:
#在并发编程中使用生产者和消费都模式能够解决绝大多数并发问题。
#该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据
#的速度。
#某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数、线程、进程等).
#产生数据的模块称为生产者,而处理数据的模块称为消费者
#优点:
#1.解耦耦合
#2.并发
#3.闲忙不均
#案例
#两个厨师对四个顾客
#厨师做包子 和 顾客吃包子问题。
#当生产的慢,消费的快的时候,get()会发生阻塞,等待
#当生产的忙,消费的快的时候,get_nowait()会发生queue.Empty error
#当生产的太快,消费的很慢的时候,队列会很快放满,生产过剩
import threading,queue,time,random
q=queue.Queue(10)
count=1
#生产者
def producer(name):
global count
while True:
if mutex.acquire():
q.put(‘包子%d’%count)
print(’[%s]生产了包子%d’%(name,count))
count+=1
time.sleep(random.random()*5)
mutex.release()
#消费者
def consumer(name):
count=1
while True:
print(’[%s]取到了[%s]包子并且吃了它’%(name,q.get()))#get_nowait()不会阻塞等待
time.sleep(random.random()*5)
if name==‘main’:
mutex=threading.Lock()
p1=threading.Thread(target=producer,args=(‘刘大厨’,))
p2 = threading.Thread(target=producer, args=(‘张大厨’,))
con_A=threading.Thread(target=consumer,args=(‘A’,))
con_B = threading.Thread(target=consumer, args=(‘B’,))
con_C = threading.Thread(target=consumer, args=(‘C’,))
con_D = threading.Thread(target=consumer, args=(‘D’,))
p1.start()
p2.start()
con_A.start()
con_B.start()
con_C.start()
con_D.start()
#[刘大厨]生产了包子1
#[A]取到了[包子1]包子并且吃了它
#[刘大厨]生产了包子2
#[B]取到了[包子2]包子并且吃了它
#[刘大厨]生产了包子3
#[C]取到了[包子3]包子并且吃了它
#[刘大厨]生产了包子4
#[D]取到了[包子4]包子并且吃了它
#[刘大厨]生产了包子5
#[B]取到了[包子5]包子并且吃了它
#[张大厨]生产了包子6
#[A]取到了[包子6]包子并且吃了它
#[张大厨]生产了包子7
#[C]取到了[包子7]包子并且吃了它
#…