Python——Queue模块以及生产消费者模型
1.了解Queue
Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递
|queue.Queue|先进先出队列|
|queue.LifoQueue|后进先出队列|
|queue.PriorityQueue|优先级队列|
|queue.deque|双线队列|
了解python队列 https://www.cnblogs.com/itogo/p/5635629.html
----------------------------------------------------------------------------------------
2.生产者和消费者模型
生产者和消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
例子1
# ecoding=utf-8
import Queue
import threading,time q = Queue.Queue(maxsize=10)
def Producer(name):
count =1
while True:
q.put("包子 %s" % count)
print "做了包子",count
count +=1
time.sleep(0.5)
def Consumer(name):
while True :
print "[%s] 取到[%s] 并且吃了它..." %(name,q.get())
time.sleep(1) p = threading.Thread(target=Producer,args=("Lily",))
c = threading.Thread(target=Consumer,args=("Lilei",))
c1 = threading.Thread(target=Consumer,args=("Ahi",)) p.start()
c.start()
c1.start()
运行结果
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子 [Lilei] 取到[包子 ] 并且吃了它... 做了包子 [Ahi] 取到[包子 ] 并且吃了它... 做了包子 [Lilei] 取到[包子 ] 并且吃了它... 做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
做了包子
[Ahi] 取到[包子 ] 并且吃了它...
做了包子
[Lilei] 取到[包子 ] 并且吃了它...
例子2
# ecoding=utf-8
from threading import current_thread, Thread
import time
import random
import queue q = queue.Queue(5) class Productor(Thread):
def run(self):
name = current_thread().getName()
nums = range(100)
while 1:
nowput = random.choice(nums)
if q.full(): # 消息队列满则停止生产
print "队列已经达到上限{0}".format(q.qsize())
time.sleep(10)
q.put(nowput)
print "生产者{0}生产了{1}".format(name, nowput)
sl = random.choice([1, 2, 3])
time.sleep(sl)
print "生产者休息了{0}秒".format(sl) class Consumer(Thread):
def run(self):
name = current_thread().getName()
while 1:
if q.empty(): # 消息队列空的时候则暂停消费
print "队列空了,暂停消费"
time.sleep(5)
num = q.get()
q.task_done()
print "消费者{0}消费了{1}".format(name, num)
sl = random.choice([1, 2, 3])
time.sleep(sl)
print "消费者休息了{0}秒".format(sl) if __name__ == '__main__':
p1 = Productor()
p1.start()
p2 = Productor()
p2.start()
c1 = Consumer()
c1.start()
c2 = Consumer()
c2.start()
c3 = Consumer()
c3.start()
运行结果
生产者Thread-1生产了90
生产者Thread-2生产了61
消费者Thread-3消费了90
消费者Thread-4消费了61
队列空了,暂停消费 消费者休息了1秒
队列空了,暂停消费
生产者休息了2秒
生产者Thread-1生产了30
消费者休息了2秒
消费者Thread-3消费了30
生产者休息了2秒
生产者Thread-2生产了15
消费者休息了1秒
消费者Thread-3消费了15
生产者休息了2秒
生产者Thread-1生产了11
生产者休息了2秒
生产者Thread-2生产了94
生产者休息了1秒
生产者Thread-1生产了18
消费者Thread-5消费了11
生产者休息了2秒消费者Thread-4消费了94
消费者休息了3秒
消费者Thread-3消费了18
参考了
https://blog.csdn.net/wyb199026/article/details/80788570
http://www.cnblogs.com/qing-chen/p/7684812.html
Python——Queue模块以及生产消费者模型的更多相关文章
- Python之queue模块以及生产消费者模型
队列 队列类似于一条管道,元素先进先出,进put(arg),取get() 有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态. 队列分类 队列有很多中,但都依赖 ...
- python queue和生产者和消费者模型
queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...
- Python - Asyncio模块实现的生产消费者模型
[原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)
一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...
- python 并发编程 多进程 生产者消费者模型总结
生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...
- JAVA实现生产消费者模型
前言 最近面试比较多,发现生产消费者模型在各公司面试的过程中问的还是比较多的,记录一下常见JAVA实现生产者消费模型的代码 思路 我们通过三种模式来实现 通过wait和notify 通过Lock和Co ...
- python Queue模块
先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...
随机推荐
- Microsoft Azure Storage架构分析
Microsoft云存储服务分为两个部分,SQL Azure和Azure Storage.云存储系统的可扩展性和功能不可兼得,必须牺牲一定的关系数据库功能换取可扩展性.Microsoft实现云存储的思 ...
- -webkit-CSS属性拾遗
-webkit-input-placeholder 这个伪类用于设置输入框placeholder文字的样式,基本可以设置例子如下: input::-webkit-input-placeholder { ...
- Explain 执行计划 和 SQL优化
Explain 介绍 在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要 ...
- XAML属性赋值转换之谜(WPF XAML语法解密)
XAML与XML类似,就是XML延伸过来的.为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了.有时候,虽然实现了某个功能,但是对实现原理还是很茫然.今天就讲讲XAM ...
- 详解C#泛型(一)
一.C#中的泛型引入了类型参数的概念,类似于C++中的模板,类型参数可以使类型或方法中的一个或多个类型的指定推迟到实例化或调用时,使用泛型可以更大程度的重用代码.保护类型安全性并提高性能:可以创建自定 ...
- java源码--HashMap扩容机制学习
待完成 Java中hash算法细述 https://blog.csdn.net/majinggogogo/article/details/80260400 java HashMap源码分析(JDK8) ...
- CustomSqlSessionFactoryBean
import java.io.File; import java.net.JarURLConnection; import java.net.URL; import java.util.ArrayLi ...
- 第4章 Selenium2-java WebDriver API (一)
4.1 从定位元素开始 WebDriver提供了八种元素定位方: 在Java语言中对应的定位方法: ·id findElement(By.id()) ·name findEleme ...
- JVM学习记录-类加载器
前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...
- windows开机提示文件损坏
今早按部就班的开机,然后准备吃热干面,很多时候事情都是同步进行的... 然后眼前出现这样一个界面 心情果断灰暗下来,按照提示一步步操作,点enter进入高级选项,试过了安全模式启动.最后一次正确配置启 ...