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 ...
随机推荐
- C# 多线程五之Task(任务)一
1.简介 为什么MS要推出Task,而不推Thread和ThreadPool,以下是我的见解: (1).Thread的Api并不靠谱,甚至MS自己都不推荐,原因,它将整个Thread类都不开放给Win ...
- springcloud~演化的微服务架构
微服务 将整体功能按着模块划分成多个独立的单元,这些单元可以独立部署,它们之前通过轻量级的web api方式进行通讯,对于微服务框架来说,最流行的就是springcloud和Service Fabri ...
- WPF中Grid的行的Height和列的Width根据内容自适应
Grid中RowDefinition的Height和ColumnDefinition的设置都有三种: 1. 具体数值,固定不变: 2. * 星号,如: 2*,5*,8*: 分母为(2+5+8=15), ...
- Entity Framework 6.x 学习之Database First
一.单表操作 1. 建表 CREATE TABLE [Chapter1].[Customer] ( , ), ) COLLATE Chinese_PRC_CI_AS NOT NULL, ) COLLA ...
- Java NIO系列教程(三) Buffer
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...
- Iptables之recent模块小结
Iptables的recent模块用于限制一段时间内的连接数, 是谨防大量请求攻击的必杀绝技! 善加利用该模块可充分保证服务器安全. recent常用参数--name 设定列表名称,即设置跟 ...
- POJ 2607 Fire Station(Floyd打表+枚举更新最优)
题目链接: http://poj.org/problem?id=2607 Description A city is served by a number of fire stations. Some ...
- zoj 1109 Language of FatMouse(map映照容器的典型应用)
题目连接: acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1109 题目描述: We all know that FatMouse doe ...
- 并发编程—— LinkedTransferQueue
1. 前言 Java 中总的算起来有 8 种阻塞队列. 我们分析了: 并发编程之 SynchronousQueue 核心源码分析 并发编程之 ConcurrentLinkedQueue 源码剖析 并发 ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...