作业 —— day39

生产者消费者模型

"""
生产者:生产/制造东西的
消费者:消费/处理东西的
该模型除了上述两个之外还需要一个媒介
   生活中的例子做包子的将包子做好后放在蒸笼(媒介)里面,买包子的取蒸笼里面拿
   厨师做菜做完之后用盘子装着给你消费者端过去
   生产者和消费者之间不是直接做交互的,而是借助于媒介做交互
   
生产者(做包子的) + 消息队列(蒸笼) + 消费者(吃包子的)
"""


from multiprocessing import JoinableQueue, Process
import random
import time


def producer(name, food, q):
    for num in range(1, 4):
        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=('Egon', '大保健服务', q))
    p2 = Process(target=producer, args=('Tank', '全套按摩服务', q))
    c1 = Process(target=consumer, args=('ason', 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执行完毕 说明消费者已经处理完数据了  消费者就没有存在的必要了
posted @ 2020-04-23 22:51  轻描丨淡写  阅读(129)  评论(0编辑  收藏  举报