生产者消费者模型案例

Posted tf511

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模型案例相关的知识,希望对你有一定的参考价值。

1.生产者消费者模型
模型 设计模式 三层结构 等等表示的都是一种编程套路
生产者指的是能够产生数据的一类任务
消费者指的是处理数据的一类任务

需求: 文件夹里有十个文本文档 要求你找出文件中包含习大大关键字的文件
打开并读取文件数据就是生产者
查找关键字的过程就是消费者

生产者消费者模型为什么出现?
生产者的处理能力与消费者的处理能力 不匹配不平衡 导致了一方等待另一方 浪费时间
目前我们通过多进程将生产 和 消费 分开处理
然后将生产者生产的数据通过队列交给消费者

总结一下在生产者消费者模型中 不仅需要生产者消费者 还需要一个共享数据区域
1.将生产方和消费方耦合度降低
2.平衡双方的能力 提高整体效率

代码实现 :
搞两个进程 一个负责生产 一个负责消费
数据需要共享所以来个队列

技术分享图片
import time,random
from multiprocessing import Process,Queue
# 制作热狗
def make_hotdog(queue,name):
    for i in range(3):
        time.sleep(random.randint(1,2))
        print("%s 制作了一个热狗 %s" % (name,i))
        # 生产得到的数据
        data = "%s生产的热狗%s" % (name,i)
        # 存到队列中
        queue.put(data)
    # 装入一个特别的数据 告诉消费方 没有了
    #queue.put(None)


# 吃热狗
def eat_hotdog(queue,name):
    while True:
        data = queue.get()
        if not data:break
        time.sleep(random.randint(1, 2))
        print("%s 吃了%s" % (name,data))

if __name__ == __main__:
    #创建队列
    q = Queue()
    p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店"))
    p2 = Process(target=make_hotdog, args=(q, "egon的热狗店"))
    p3 = Process(target=make_hotdog, args=(q, "老王的热狗店"))


    c1 = Process(target=eat_hotdog, args=(q,"思聪"))
    c2 = Process(target=eat_hotdog, args=(q, "李哲"))

    p1.start()
    p2.start()
    p3.start()

    c1.start()
    c2.start()

    # 让主进程等三家店全都做完后....
    p1.join()
    p2.join()
    p3.join()

    # 添加结束标志   注意这种方法有几个消费者就加几个None 不太合适 不清楚将来有多少消费者
    q.put(None)
    q.put(None)


    # 现在 需要知道什么时候做完热狗了 生产者不知道  消费者也不知道
    # 只有队列知道



    print("主进程over")





    # 生产方不生产了 然而消费方不知道 所以已知等待  get函数阻塞
    # 三家店都放了一个空表示没热狗了  但是消费者只有两个 他们只要看见None 就认为没有了
    # 于是进程也就结束了  造成一些数据没有被处理
    # 等待做有店都做完热狗在放None
生产者与消费者1
技术分享图片
import time,random
from multiprocessing import Process,JoinableQueue
# 制作热狗
def make_hotdog(queue,name):
    for i in range(3):
        time.sleep(random.randint(1,2))
        print("%s 制作了一个热狗 %s" % (name,i))
        # 生产得到的数据
        data = "%s生产的热狗%s" % (name,i)
        # 存到队列中
        queue.put(data)
    # 装入一个特别的数据 告诉消费方 没有了
    #queue.put(None)

# 吃热狗
def eat_hotdog(queue,name):
    while True:
        data = queue.get()
        time.sleep(random.randint(1, 2))
        print("%s 吃了%s" % (name,data))
        # 该函数就是用来记录一共给消费方多少数据了 就是get次数
        queue.task_done()


if __name__ == __main__:
    #创建队列
    q = JoinableQueue()
    p1 = Process(target=make_hotdog,args=(q,"邵钻钻的热狗店"))
    p2 = Process(target=make_hotdog, args=(q, "egon的热狗店"))
    p3 = Process(target=make_hotdog, args=(q, "老王的热狗店"))


    c1 = Process(target=eat_hotdog, args=(q,"思聪"))
    c2 = Process(target=eat_hotdog, args=(q, "李哲"))

    p1.start()
    p2.start()
    p3.start()

    # 将消费者作为主进程的守护进程
    c1.daemon = True
    c2.daemon = True


    c1.start()
    c2.start()

    # 让主进程等三家店全都做完后....
    p1.join()
    p2.join()
    p3.join()


    # 如何知道生产方生产完了 并且 消费方也吃完了

    # 方法一:等待做有店都做完热狗在放None
    # # 添加结束标志   注意这种方法有几个消费者就加几个None 不太合适 不清楚将来有多少消费者
    # q.put(None)
    # q.put(None)

    # 主进程等到队列结束时再继续  那队列什么时候算结束? 生产者已经生产完了 并且消费者把数据全取完了
    q.join()  # 已经明确生产放一共有多少数据

    # 现在 需要知道什么时候做完热狗了 生产者不知道  消费者也不知道
    # 只有队列知道

    print("主进程over")
    # 生产方不生产了 然而消费方不知道 所以一直等待  get函数阻塞
    # 三家店都放了一个空表示没热狗了  但是消费者只有两个 他们只要看见None 就认为没有了
    # 于是进程也就结束了  造成一些数据没有被处理
生产者与消费者2

 







































以上是关于生产者消费者模型案例的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程:生产者消费者模型

队列生产者消费者模型

条件变量生产者和消费者模型

生产者消费者模型 与多线程

线程通信之生产者消费者模型

消息中间件ActiveMQ学习笔记 [Java编码MQ,消费者生产者基本模型]