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= ...
随机推荐
- H2数据库
官网:http://www.h2database.com H2数据库默认的~/test数据库在Win10下所在的位置为 C:/Users/yourname/下,也就是执行cmd的第一个目录 其中的.h ...
- 将Long类型转为字母数字组合的jar包---Hashids
在设计数据库时,我有时喜欢使用自增Id,而不是uuid,但是在面对终端用户时,直接暴露id不是一个好的行为. 经过查询,可以使用 Hashids 这个jar包将id转为类似YouTube的大小写字母和 ...
- 铁板纹理 Base Shape
软件:Substance Designer 2017.1.2 最近正在根据官方的教程,学习Metal Rust纹理的制作.这篇文章仅记录Base Shape的制作方法. Base Shape最终渲染效 ...
- 第24课 可变参数模板(5)_DllHelper和lambda链式调用
1. dll帮助类 (1)dll的动态链接 ①传统的调用方式:先调用LoadLibrary来加载dll,再定义函数指针类型,接着调用GetProcAddress获取函数地址.然后通过函数指针调用函数, ...
- Android 获取控件滑动速度,速度跟踪器VelocityTracker;
VelocityTracker 速度跟踪器 在写关于Android滑动的控件,如果用户手指在屏幕上(当前位置 - 起始位置 > 某个数值)就做一个界面切换,但是总感觉太生硬,只有满足上面的条件才 ...
- 反序列化失败Failed to deserialize --- local class incompatible: stream classdesc serialVersionUID
反序列化失败: java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework. ...
- python基础数据篇
1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ? 1 names = ['Alex',"Tenglan",' ...
- K8s部署使用CFSSL创建证书
证书的编码格式 PEM(Privacy Enhanced Mail),通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, 和 ...
- Linux的nmon监控结果分析文件中网络分析NET
1.首先,使用# ifconfig查看Linux系统中的网卡名称,有的是eth0,有的是em1,以查看结果为准,下图为em1 2.先试试Linux系统中有没有安装ethtool工具,没有的话,下载et ...
- Linux网络编程学习(四) -----守护进程的建立(第三章)
本文介绍一个例程daemon_init() #include <sys/types.h> #include <signal.h> #include <unistd.h&g ...