生产消费者作业
""" 生产者:生产/制造东西的 消费者:消费/处理东西的 该模型除了上述两个之外还需要一个媒介 生活中的例子做包子的将包子做好后放在蒸笼(媒介)里面,买包子的取蒸笼里面拿 厨师做菜做完之后用盘子装着给你消费者端过去 生产者和消费者之间不是直接做交互的,而是借助于媒介做交互 生产者(做包子的) + 消息队列(蒸笼) + 消费者(吃包子的) """ # from multiprocessing import Queue, Process from multiprocessing import JoinableQueue, Process import random import time def producer(name, food, q): for num in range(1, 9): print('%s 制作 %s 1笼' % (name, food)) # 模拟网络延迟 time.sleep(random.randint(1, 2)) # 将数据加入队列 q.put(food) def consumer(name, q): while True: food = q.get() # 假如没有数据,程序就会在此处进入堵塞态 # 判断当前是否有结束的标识 # if food is None:break time.sleep(random.randint(1, 3)) print('%s食用了%s' % (name, food)) q.task_done() # 告诉队列你已经从里面取出了一个数据并且处理完毕了 if __name__ == '__main__': # q = Queue() q = JoinableQueue() p1 = Process(target=producer, args=('大厨', '虾饺', q)) p2 = Process(target=producer, args=('大厨', '蒸饺', q)) c1 = Process(target=consumer, args=('umi', q)) p1.start() p2.start() # 将消费者设置成守护进程 c1.daemon = True c1.start() p1.join() p2.join() # 等待生产者生产完毕之后 往队列中添加特定的结束符号 # q.put(None) # 有多少消费者就往队列中添加多少None,新添加的None必定在队列的末尾 q.join() # 等待队列中所有的数据被取完再执行往下执行代码 """ JoinableQueue 每当你往该队列中存入数据的时候 内部会有一个计数器+1 没当你调用task_done的时候 计数器-1 q.join() 当计数器为0的时候 才往后运行 """ # 只要q.join执行完毕 说明消费者已经处理完数据了 消费者就没有存在的必要了