生产者消费者模型

'''
生产者消费者模型:
为什么要使用生产者和消费者模式?
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就
必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式?
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完
数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
'''

import time, threading, queue, random

q = queue.Queue()

def Producer(name):
count = 1
while count<11:
print('%s厨师做包子中...' % name)
time.sleep(random.randrange(4))
q.join() # ②等待消费者的q.task_done(),当消费者线程停了,那么生产者的q.join()也收不到任何消息,所以程序卡住了
q.put(count)
# q.task_done() # ①
print('%s厨师做好了第%s个包子!' % (name, count))
count += 1

def Cousumer(name):
count = 1
while count<11:
time.sleep(random.randrange(4))
# if not q.empty():
# data = q.get()
# print('\033[1;31;43m%s吃了第%s个包子\033[0m' % (name, data))
# else:
# print('\033[1;33;41m%s说没包子了,厨师你快一点行不行啊?\033[0m' % name)

# q.join() # ①如果其它线程没有q.task_done(),那么这个线程会一直卡在这里,不会往下执行
data = q.get()
q.task_done() # ②
print('\033[1;31;43m%s吃了第%s个包子\033[0m' % (name, data))
count += 1

p1 = threading.Thread(target=Producer, args=('威猛',))
c1 = threading.Thread(target=Cousumer, args=('孙俪',))
# c2 = threading.Thread(target=Cousumer, args=('小雯',))
# c3 = threading.Thread(target=Cousumer, args=('李华',))

p1.start()
c1.start()
# c2.start()
# c3.start()

'''Python输出带颜色字体详解:https://www.cnblogs.com/daofaziran/p/9015284.html'''
上一篇:shell脚本之一键部署yum本地源兼yum阿里源,再也不用为程序的下载安装烦扰!


下一篇:作业3