17.生产者与消费者模式,多对多的问题

#多对多

import threading
import queue,time,random

q = queue.Queue(maxsize=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())
            mutex.release()

def consumer(name):
    global count
    while True:
        # if mutex.acquire():

        print('[%s]取到了[%s],并且吃了它'%(name,q.get()))
        time.sleep(1)
            # mutex.release()

if __name__ == "__main__":

    mutex = threading.Lock()

    p1 = threading.Thread(target=producer,args=('张大厨',))
    p2 = threading.Thread(target=producer,args=('李大厨',))

    a = threading.Thread(target=consumer,args=('A',))
    b = threading.Thread(target=consumer,args=('B',))
    c = threading.Thread(target=consumer,args=('C',))
    d = threading.Thread(target=consumer,args=('D',))

    p1.start()
    p2.start()

    a.start()
    b.start()
    c.start()
    d.start()

#总结说明
'''
1.为什么要使用生产者和消费者模式
在线程的世界里,生产者就是生产数据的线程,消费者就是消费数据的线程,
在多线程开发当中,如果生产者处理的速度很快,而消费者处理的速度很慢,那么生产就必须等待消费者处理完成,
才能继续生产数据,同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者,
为了解决这个问题,所以才引入了~~~

2.什么是生产者与消费模式
生产者消费者模式通过一个容器来解决生产者与消费者的强耦合问题,生产者和消费者不直接通信,
而是通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给队列,
消费者不找生产者要数据,而是直接从队列中取,阻塞队列就相当于缓冲区,平衡消费者和生产者的处理能力,
所以基于队列实现生产者和消费或者模型。
'''
原文地址:https://www.cnblogs.com/zhangboblogs/p/8627610.html