今天我们来了解一下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的更多相关文章

  1. Python 单向队列Queue模块详解

    Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...

  2. python消息队列Queue

    实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...

  3. Python之队列queue模块使用 常见问题与用法

    python 中,队列是线程间最常用的交换数据的形式.queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式 import queue q = queu ...

  4. 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()) ...

  5. python实现队列(queue)

    队列队列是一种先进先出的数据结构,主要操作包括入队,出队.入队的元素加入到对尾,从队头取出出队的元素.这里用列表简单模拟队列,其实现如下: queue()is_empty()size()enqueue ...

  6. Tornado使用-队列Queue

    1.tornado队列的特点 和python标准队列queue相比,tornado的队列Queue支持异步 2.Queue常用方法 Queue.get() 会暂停,直到queue中有元素 Queue. ...

  7. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  8. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  9. python网络编程-线程队列queue

    一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...

随机推荐

  1. cordova插件列表

    主要来源为http://blog.csdn.net/github_39500961/article/details/76270299 1.获取当前应用的版本号 cordova plugin add c ...

  2. 【算法和数据结构】_16_小算法_IntToStr: 将整型数据转换为字符串

    /* IntToStr: 将整型数据转换为字符串 */ #include <stdio.h> void int_to_str(const unsigned long int i_numbe ...

  3. cookie.js插件

    /*! cookiejs v1.0.23 | MIT (c) 2018 kenny wong | https://github.com/jaywcjlove/cookie.js */!function ...

  4. 第一个Eureka程序,Eureka Client的自启动原理和简要过程

    https://blog.csdn.net/u011531425/article/details/81675289 在之前的Spring Cloud Config的基础上,搭建简单的Eureka Se ...

  5. 转载--无弹窗APT渗透实验

    转载--无弹窗APT渗透实验 文章作者:亚信安全,转载自 FreeBuf.COM APT攻击方式花样繁多,我研究最近的流行的APT攻击方式,在本地搭建环境模拟一次简单的APT攻击,在模拟攻击过程中发现 ...

  6. vs2017 本地IP地址调试 局域网调试

    在项目sln目录下有一个隐藏文件夹.vs\config\applicationhost.config <bindings> <binding protocol="http& ...

  7. xmanagr 注册机执行ubuntu 桌面程序,ubuntu无需安装 桌面环境

    Xshell 5 注册码: 690313-111999-999313Xftp 5 注册码:101210-450789-147200 Xmanager 5 注册码:101210-450789-14720 ...

  8. MATLAB——矩阵排序详解

    <span style="font-size:18px;">(1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排 ...

  9. tensorflow实战系列(四)基于TensorFlow构建AlexNet代码解析

    整体流程介绍: 我们从main函数走,在train函数中,首先new了一个network;然后初始化后开始训练,训练时设定设备和迭代的次数,训练完后关闭流程图. 下面看network这个类,这个类有许 ...

  10. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...