生产者消费者模型的简单认识

一.生产者消费者模型

生产者:程序中负责产生数据的任务

消费者:程序中负责处理数据的任务

模型:就是模板

生产者----->共享的介质(队列)------->消费者

生产者只与队列沟通,消费者也只与队列沟通.

二.为何用生产者消费者模型

实现了生产者与消费者之间的解耦和

生产者可以不停的生产,消费者可以不停的消费,从而平衡了生产者的生产能力与消费者的消费能力.提升了程序的运行效率.

当我们程序中明显存在两种任务,一种负责产生数据,一种负责处理数据,那么我们可以用生产者消费者模型.

import time
import random
from multiprocessing import Process, JoinableQueue


def producer(name, food, q):
    for i in range(3):
        res = '%s%s' % (food, i)
        time.sleep(random.randint(1, 3))
        # 放进队列
        q.put(res)
        print('\033[45m%s 生产了%s\033[0m' % (name, res))


def consumer(name, q):
    while True:
        # 从队列里取走
        res = q.get()
        time.sleep(random.randint(1, 3))
        print('\033[46m%s 吃了%s\033[0m' % (name, res))
        q.task_done()  # 只是告诉队列有一个数据被取走了,并不代表结束


if __name__ == '__main__':
    # 先造一个队列
    q = JoinableQueue()

    # 生产者们
    p1 = Process(target=producer, args=('egon', '包子', q,))
    p2 = Process(target=producer, args=('tom', '馒头', q,))
    p3 = Process(target=producer, args=('bob', '点心', q,))

    # 消费者们
    c1 = Process(target=consumer, args=('alex', q,))
    c2 = Process(target=consumer, args=('aaa', q,))
    # 开子进程的目的就是为了并发执行任务,而并发执行的任务它的生命周期伴随着主进程结束任务而结束掉,所以用到了守护进程
    c1.daemon = True
    c2.daemon = True

    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

    p1.join()
    p2.join()
    p3.join()

    q.join()  # 让主进程等q结束,等待队列被取干净
    # q.join()意味着主进程的代码运行完毕--->(生产者运行完毕)+队列中的数据也被取干净--->消费者全部取完数据,没有存在的意义
    print('主')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: educoder生产者消费者问题实践是一种经典的多线程编程问题,旨在通过生产者消费者之间的协作来实现数据的安全共享。在这个问题中,生产者负责生产数据并将其放入缓冲区中,而消费者则负责从缓冲区中取出数据并进行消费。为了保证数据的安全共享,需要使用同步机制来避免生产者消费者之间的竞争条件和死锁等问题。通过实践这个问题,可以加深对多线 ### 回答2: 生产者消费者(Producer-Consumer)问题是计算机领域中的经典问题,主要围绕着线程同步问题展开。在educoder上有一道题目关于生产者消费者问题的实践题目,我们需要通过编程来实现一个基于生产者消费者模型的程序。 在本题目中,我们需要编写一个程序,该程序运行包含两个线程,一个是生产者线程,一个是消费者线程,他们需要同时运行。生产者线程会不断的生产商品并添加到一个“篮子”中,消费者线程则会从这个“篮子”中取出商品进行消费。如果篮子中已经有了商品,那么生产者就需要等待,直到消费者消费了一些商品,并释放了“篮子”空间。 在解决这个问题的时候,我们需要用到共享资源的概念。在本题目中,我们将“篮子”的空间看做是一个共享资源,需要互斥地被生产者消费者访问。因此,我们需要使用一些操作系统提供的同步机制,例如锁,信号量等来保证线程之间的同步与互斥。 具体实现的方法如下:首先,我们需要定义一个“篮子”类,其内部需要定义一个商品队列,以及必要的状态锁,信号量等。然后,我们需要在主函数中创建生产者消费者线程,并将“篮子”对象作为参数传递给这两个线程。生产者线程会在一个 while 循环中不断地生产商品,将商品添加到“篮子”队列中,并通知消费者线程有新的商品可以消费;消费者线程则会在一个 while 循环中不断地从“篮子”队列中取出商品进行消费,如果队列为空,则会等待生产者线程通知有新的商品到来。 总的来说,这个实践题目帮助我们更好的理解了生产者消费者模型,并加深了我们对线程同步机制的理解和运用技能。 ### 回答3: 生产者消费者问题是一种经典的并发编程问题,在并发编程中经常遇到。该问题的主要目的是协调“生产者”和“消费者”的操作,使得它们能够有序地进行操作,不会发生死锁或饥饿等问题。在Educoder生产者消费者问题实践中,通过理论学习和实践操作,我对该问题有了更深入的理解。 首先,我们知道,生产者负责生产物品并将其放置在缓冲区,消费者则从缓冲区中取出物品进行处理。因此,在实践中,我们需要考虑如何保证缓冲区的线程安全性。在Educoder的实践中,我通过Semaphore信号量进行了操作。Semaphore是一种计数信号量,用于保护共享资源,可以指定一个计数值,其中生产者可以增加计数值,消费者可以减少计数值,当计数值为0时,消费者必须等待,直到有生产者增加计数值。 其次,在实践中,我们还需要考虑如何避免死锁和饥饿问题。由于生产者消费者的操作互相依赖,在多线程操作中容易产生死锁的情况,因此我们需要采取相应的策略来避免死锁情况的发生。在Educoder的实践中,我采用了先生产后消费的策略,确保在生产者将物品放入缓冲区之后,消费者才能进行取出和处理。此外,我还采用了公平锁来避免饥饿问题的发生,保证了每个线程都有机会参与执行。 总之,在Educoder生产者消费者问题的实践中,我学习了并发编程的基础知识,并通过实践操作加深了对Semaphore的理解。通过理论结合实践,我对生产者消费者问题有了更深入的认识,同时也掌握了更多的编程技巧和策略,为以后的并发编程操作奠定了更加坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值