1. 队列

先进先出

2. 栈

先进后出

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用。可以使用队列来实现线程间的同步。

用FIFO队列实现上述生产者与消费者问题的代码如下:

#encoding=utf-8
import threading
import time#python2中
from Queue import Queue#python3中
# from queue import Queueclass Producer(threading.Thread):def run(self):global queuecount = 0while True:if queue.qsize() < 1000:for i in range(100):count = count +1msg = '生成产品'+str(count)queue.put(msg)print(msg)time.sleep(0.5)class Consumer(threading.Thread):def run(self):global queuewhile True:if queue.qsize() > 100:for i in range(3):msg = self.name + '消费了 '+queue.get()print(msg)time.sleep(1)if __name__ == '__main__':queue = Queue()for i in range(500):queue.put('初始产品'+str(i))for i in range(2):p = Producer()p.start()for i in range(5):c = Consumer()c.start()

3. Queue的说明

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

4. 生产者消费者模式的说明

  • 为什么要使用生产者和消费者模式

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

  • 什么是生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦

生产者与消费者模式(python 版)相关推荐

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

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

  2. python 生产者和消费者模式_Python爬虫:生产者和消费者模式

    认识生产者和消费者模式 生产者和消费者是多线程中很常见的一个问题.产生数据的模块,我们称之为生产者,而处理数据的模块,就称为消费者.但是单单只有生产者和消费者显然还是不够的,一般来说,我们还有一个缓冲 ...

  3. python 多线程并发编程(生产者、消费者模式),边读图像,边处理图像,处理完后保存图像实现提高处理效率

    文章目录 需求 实现 先导入本次需要用到的包 一些辅助函数 如下函数是得到指定后缀的文件 如下的函数一个是读图像,一个是把RGB转成BGR 下面是主要的几个处理函数 在上面几个函数构建对应的处理函数 ...

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

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

  5. 线程间的协作(2)——生产者与消费者模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.何为生产者与消费者 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程. import java.util. ...

  6. 认识生产者和消费者模式

    认识生产者和消费者模式 生产者和消费者是多线程中很常见的一个问题.产生数据的模块儿,我们称之为生产者,而处理数据的模块,就称为消费者.但是单单只有生产者和消费者显然还是不够的,一般来说,我们还有一个缓 ...

  7. 生产者、消费者模式实现

    1.1生产和1消费 一个String对象,生产者设定值,消费者拿走值. wait()/notify()实现 生产者 public class Product {private String lock; ...

  8. Java多线模式-Producer-Consumer模式(生产者、消费者模式)

    1.场景 有些时候需要两个或两个以上的线程协同工作,每个线程需要使用其他线程产生数据. 2.详细说明 可以把上面的场景抽象成生产者和消费者模式.从消费者的角度:消费者需要消费生产者生成的产品. 从生产 ...

  9. 多线程通信—生产者和消费者模式

    1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...

最新文章

  1. HDU 1573~3579 X问题Hello Kiki[同余方程]
  2. [转]WxEmojiView
  3. 如何修改Linux主机名
  4. [视频教程] docker端口映射与目录共享运行PHP
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1080:余数相同问题
  6. 动态规划经典算法--最长公共子序列 LCS
  7. Java Process中waitFor()的问题
  8. Spring MVC集成slf4j-logback
  9. Hive的安装和使用以及Java操作hive
  10. docker学习5--docker数据卷(volume)
  11. Linux定时任务Crontab详解
  12. X32位 天堂2 二章/三章 服务端协议号修改方法
  13. ORACLE 行转列谓词推入
  14. LAMP部署phpadmin
  15. python文本文件对比_Python-文件差异对比
  16. Linux应用开发(十一)——I^2C接口
  17. 信号与系统——信号的分解
  18. 【PAT】1030 完美数列 (25 分)
  19. QML初学读书笔记(三)
  20. 函数周期表丨INTERSECT

热门文章

  1. linux crontab定时任务详解
  2. Yii2 理解Validator
  3. Symantec Backup Exec 2014 备份Exchange 2013之二安装主备服务器
  4. spring+hibernate+Struts2 整合(全注解及注意事项)
  5. 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的...
  6. ext/iconv/.libs/iconv.o: In function `_php_iconv_strlen'
  7. mysql 格式化_mysql中格式化数字详解
  8. 【.NET框架】—— ASP.NET MVC5路由基础(五)
  9. iOS Class结构分析
  10. Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测