什么是生产者消费者模式

在软件开发过程中,经常会遇到这样的情景:
某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数、线程、进程等)。产生数据的模块称为生产者,而处理数据的模块称为消费者。在生产者与消费者之间的缓冲区称之为仓库。生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式。

结构图:

举个栗子:
假如珍妮要寄一封信,大致过程如下
1、珍妮把信写好 —— 相当于生产者生产数据 
2、珍妮把信放入邮箱 —— 相当于生产者把数据放入缓冲区
3、邮递员把信从邮箱取出,做相应处理 —— 相当于消费者把数据取出缓冲区,处理数据

生产者消费者模式优点

1、解耦
假设生产者和消费者分别是两个线程。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。如果未来消费者的代码发生变化,可能会影响到生产者的代码。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。

2、并发
由于生产者与消费者是两个独立的并发体,他们之间是用缓冲区通信的,生产者只需要往缓冲区里丢数据,就可以继续生产下一个数据,而消费者只需要从缓冲区拿数据即可,这样就不会因为彼此的处理速度而发生阻塞。

3、忙闲不均
当生产者制造数据快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中,慢慢处理掉。而不至于因为消费者的性能造成数据丢失或影响生产者生产。

下面用代码实现一下:

代码演示:

from queue import Queue
import threading
import time#创建队列
q = Queue(10)def producer(name):"""生产者"""count = 1 # 给生产者的信计数while True:q.join() #等待task_done()发送信号q.put(count)print("%s正在写第%d封信"%(name,count))count += 1time.sleep(0.1)def customer(name):"""消费者"""count = 1while True:x = q.get()print("%s正在取第%d封信"%(name,x))count += 1q.task_done() #取完后发送信号time.sleep(1)if __name__ == '__main__':t1 = threading.Thread(target=producer,args=("珍妮",))t2 = threading.Thread(target=customer,args=("邮递员",))t1.start()t2.start()

运行结果:

今天就写这里

python中的 生产者和消费者相关推荐

  1. Python中的生产者与消费者模式(转载)

    利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 1.什么是生产者和消费者? 在线程世界里,生产者就是生产数据(或者说发布任务)的线程 ...

  2. python中的生产者与消费者模式

    Queue的说明 对于Queue,在多线程通信之间扮演重要的角色 添加数据到队列中,使用put()方法 从队列中取数据,使用get()方法 判断队列中是否还有数据,使用qsize()方法 生产者消费者 ...

  3. 操作系统中多生产者多消费者问题中,关于生产者或消费者中的两个P操作是否可以互换问题

    本文是对网上答复做的补充和修改,变动很大,对很多内容是持有相反观点的,并对一些内容进行了解释,这样使整个过更加清晰些,不为奖励,只为和我一样在理解很浅时的同学解惑.字可能很多,但我希望你读完,尤其是你 ...

  4. Java中,生产者和消费者的问题

    一,问题:生产者将生产出来的产品放入仓库中(仓库的容量为10),而消费者从仓库中取走产品(当仓库的产品数量为0时,不能取产品).使用多线程方法解答. 以下是我写的解法:有四个文件组成. Cangku. ...

  5. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

  6. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  7. Java中生产者与消费者问题的演变

    想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...

  8. python中查看关键字需要在python解释器中执行_Day09-python基础之Cpython解释器支持的进程与线程...

    一.进程与线程理论基础 1.背景知识 进程的概念起源于操作系统,是操作系统最核心的概念. 进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先 ...

  9. 并发模式:生产者和消费者

    在我15年的职业生涯中,生产者和消费者的问题是我仅遇到过几次. 在大多数编程情况下,我们正在做的事情是以同步方式执行功能,其中JVM或Web容器自行处理多线程的复杂性. 但是,在编写某些需要的用例时. ...

最新文章

  1. getRotationMatrix2D 函数
  2. 微软算法100题58 从尾到头输出链表(java)
  3. iOS开发-Xcode入门ObjC程序
  4. AI入门:不用任何公式把循环神经网络讲清楚
  5. 熊猫分发_实用熊猫指南
  6. Apache Kafka简介
  7. java 代码 设置环境变量_Java 配置环境变量教程
  8. iptables高级应用实例
  9. vue-cli 搭建的项目处理不同环境下请求不同域名的问题
  10. 交通灯c语言单片机课程设计,交通灯单片机课程设计C语言.doc
  11. 通信方式、通信接口、通信总线、通信协议的关系
  12. matplotlib绘制风能玫瑰图
  13. C语言枚举进程,实现一个简单的内存补丁
  14. 用c#做的打地鼠小游戏,整理一下上课学的
  15. 单片机看门狗工作原理
  16. 机器学习-33-Anomaly Detection(异常侦测)
  17. c语言数据结构课程设计电梯,数据结构课程设计报告(模拟电梯).doc
  18. 运维经理:如果连CentOS网络配置都不会,就收包袱走人吧
  19. Visual Studio Code(code)修改背景图片
  20. 关于搭建视频直播运营平台的一点经验和心得

热门文章

  1. jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等
  2. automake使用实例
  3. Go Web编程--深入学习解析HTTP请求
  4. PC版-B站下载视频
  5. 如何安装dubbo的管理控制台
  6. kafka可视化客户端工具(Kafka Tool)的使用
  7. JVM性能优化之栈区域OOM问题
  8. 遍历集合常见的两种方式
  9. springboot整合springbatch
  10. 洛谷试炼场-简单数学问题-二分查找