Python之队列Queue
今天我们来了解一下python的队列(Queue)
queue is especiall useful in threaded programming when information must be exchanged safely between multiple threads.
队列就是一个有顺序的容器,可以靠顺序把他分成这几类。
FIFO队列和LIFO队列
FIFO,即first in first out ,数据是先进先出,而LIFO队列是last in first out ,数据后进先出。
class queue.Queue(maxsize=0) #先进先出
class queue.LifoQueue(maxsize=0) #后进先出
class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级
所以说队列的效果和列表的效果是一致的。但是最直接的区别是从列表里取数后数据还在列表内,而队列是取出一个数据就少了一个。
优先级队列的用法:
q = queue.PriorityQueue()
q.put((0,'a'))
q.put((2,'b'))
q.put((1,'c'))
print(q.get())
print(q.get())
print(q.get())
优先级队列
所以,优先级的队列是把数据按照元组的方式存在队列里,然后依据元组第0个数据的大小取出数据
(0, 'a')
(1, 'c')
(2, 'b')
运行结果
队列的基本用法
1.数据操作
import queue
q = queue.Queue(maxsize=5) #实例化队列
q.put(item=,block=,timeout=) #数据入队列
q.get(block=,timeout=) #数据出队列
在数据进出队列时,block默认值为True,即如果在定义队列的时候定义了队列的大小,如果队列溢出后在向队列里放数据后会阻塞,直到有数据出队列才会放行。
同理,如果get的时候队列已经空了,也会阻塞,直到有数据进队列。
如果想避开这个阻塞,我们可以在put和get的时候加上timeout的值,或者把block值设为false,数据量超出就会抛出full或empty的异常,然后进行相关操作。
另外还有个另外的用法是这样的
q.get_nowait() #数据出队列(不阻塞)
q.put_nowait() #数据入队列(不阻塞)
在用nowait的方式操作队列时,程序不会阻塞,只会弹出相应的错误,我们可以用try来抓取异常后进行相关的动作。
2.队列的判定
q.empty() #判定队列是否为空
q.full() #判定队列是否溢出
输出为True或False。
队列的作用:
1.提高程序的效率。客户端可以不用等待数据的处理,只把数据仍在队列里等待处理完成后取出即可。
2.可以通过队列降低生产者和消费者之间的关系,起到程序解耦的作用,消费者或生产者只和队列有关联,而没有直接的关系。
生产——消费者模型。
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
在这里引申出这个模型,因为最基础的生产消费者模型是基于队列工作的。
让我们看一下最简单的一个生产消费者模型:
在一个数据采集系统中,可以把DAQ看作是生产者,所有原始的数据都是DAQ来产生的,我们把DAQ放在一个线程内,采集获得的数据存入队列,对数据的分析、处理可以看作消费者,消费者不断从队列里将数据取出。
import threading,queue
import random,time
def analog_in(): #生成随机信号
data = random.randint(4000,20000)
data= data/1000
return data def DAQ_Producer():
i =1
while True:
data = analog_in()
data_queue.put(data)
time.sleep(0.5)
print('get %s data:%s'%(i,data))
i+=1
def DAQ_customer():
while True:
elec_singal = data_queue.get()
pressure = (elec_singal-4)/16*10
time.sleep(0.5)
print('pressure is %.3f MPa.'%pressure) data_queue=queue.Queue(maxsize=10) t = threading.Thread(target=DAQ_Producer,)
t.start() #get data c = threading.Thread(target=DAQ_customer,)
c.start() #data processing
生产——消费者模型
我们用随机数生成一个4~20mA的电流信号,假设压力变送器满量程为10MPa,可以按照2semples/s的采样速率对信号进行采集。
Python之队列Queue的更多相关文章
- Python 单向队列Queue模块详解
Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...
- python消息队列Queue
实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...
- Python之队列queue模块使用 常见问题与用法
python 中,队列是线程间最常用的交换数据的形式.queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式 import queue q = queu ...
- python常见队列queue分类
import queue # 1.普通q# 2.先进后出q# 3.优先级q 普通Queue q=queue.Queue(3)q.put(1)q.put(2)q.put(3)print(q.get()) ...
- python实现队列(queue)
队列队列是一种先进先出的数据结构,主要操作包括入队,出队.入队的元素加入到对尾,从队头取出出队的元素.这里用列表简单模拟队列,其实现如下: queue()is_empty()size()enqueue ...
- Tornado使用-队列Queue
1.tornado队列的特点 和python标准队列queue相比,tornado的队列Queue支持异步 2.Queue常用方法 Queue.get() 会暂停,直到queue中有元素 Queue. ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- python网络编程-线程队列queue
一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...
随机推荐
- docker 进程监控 Dumb-Init进程信号处理 --转自https://blog.csdn.net/tiger435/article/details/54971929
随着docker及Kubernetes技术发展的越来越成熟稳定,越来越多的公司开始将docker用于生产环境的部署,相比起物理机上直接部署,多了一层docker容器的环境,这就带来一个问题:进程信号接 ...
- 【剑指offer】判断出栈序列是否合法
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应 ...
- ubuntu16.04 安装最新版nodejs
ubuntu软件仓库中自带的nodejs版本过低 $ apt-cache policy nodejs nodejs: Installed: (none) Candidate: 4.2.6~dfsg-1 ...
- Filedset
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java中常用类(包装类扩展知识)
Java常用类有哪些? 八大基本数据类型的包装类 包装类均位于java.lang包中,包装类和基本数据类型的对应关系如下表: 基本数据类型 包装类 byte Byte boolean Boolean ...
- vue1 & vue2 数据驱动更新视图机制对比
vue1 小粒度更新,精确追踪到数据变化所影响的dom变化,精确更新变化的dom 具体实现为,维护 observer watcher directive 三个类 ·observer负责监听数据变化,并 ...
- 安装ORACLE高可用RAC集群11g执行root脚本的输出信息
安装ORACLE高可用RAC集群11g执行root脚本的输出信息 作者:Eric 微信:loveoracle11g [root@node1 ~]# /u01/app/oraInventory/orai ...
- C++中宽字符类型(wchar_t)的编码
转载自: http://www.ituring.com.cn/article/111027 问题的起因是和一个朋友讨论不同编码的转换问题,说到了wchar_t的类型,朋友的看法是,wchar_t的编码 ...
- css3属性box-sizing:border-box 用法解析
响应式Web设计经常需要我们通过百分比设置组件宽度.如果我们不考虑边框,那么很容易就可以实现,但如果你给每一列以及总宽度都采用百分比设置,那这个时候固定的边框大小就会出来捣乱.下面我们将看到一组方法去 ...
- mybatis入门篇:通过SqlSession.selectList进行数据查询
作为一个java菜鸟,早就从慕课网中学到一些基本的mybatis的用法,但是一直不成体系,懵懵懂懂,既然正式入了java这个坑,就打算好好学学,所以买了本<MyBatis从入门到精通>,在 ...