Python 队列Queue和PriorityQueue解析
作者:a?flying?bird 发布时间:2023-07-15 20:31:11
Python 队列Queue和PriorityQueue
Python的Queue模块
适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。
FIFO: First in, First out.先进先出
LIFO: Last in, First out.后进先出
优先级队列PriorityQueue的特点
给定一个优先级(Priority)
每次pop操作都会返回一个拥有最高优先级的项
from queue import Queue#先进先出队列
from queue import PriorityQueue#优先级队列
import time
#队列:先进先出
q = Queue()#创建一个空队列,队列大小没有指定
#判断队列是是否为空
#当一个队列为空的时候如果再用get取则会堵塞,所以取队列的时候一般是用到
#get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常
#所以更常用的方法是先判断一个队列是否为空,如果不为空则取值
print(q.empty())
#队列的操作:存--put() 取--get()
q.put('page1')
q.put('page2')
q.put('page3')
print(q.empty())
#判断队列是否已经满了
print(q.full())
q1 = Queue(3)#在创建队列时,指定队列大小(表示该队列最多能存多少个元素)
q1.put('1')
q1.put('1')
q1.put('1')
print(q1.full())
q2 = Queue(3)
q2.put('1')
q2.put('2')
q2.put('3')
value = q2.get()#遵循的原则是:先进先出
print(value)
print(q2.full())
#存数据---阻塞
q3 = Queue(3)
q3.put(1)
q3.put(2)
q3.put(3)
# q3.put(4)#如果队列已经满了,等着(阻塞),一直等到队列腾出空间,然后把值存入到队列当中。
#取数据--阻塞
q4 = Queue(3)
q4.put(1)
value = q4.get()#1,此时队列为空
print('q4:',value)
# value = q4.get()#阻塞,直到队列当中有新值的时候,取出,结束阻塞。
#非阻塞
q5 = Queue(3)
q5.put(1)
#1.取
print('q5.qsize:',q5.qsize())#当前队列当中的元素个数
#方法1:
# while not q5.empty():
# value2 = q5.get(block=False)#block为Ture,表示阻塞,否则为非阻塞。非阻塞就是“强取”
# print('q5:',value2)
#方法2:
while q5.qsize()>0:
value2 = q5.get(block=False)
print('q5:',value2)
print('q5.qsize:',q5.qsize())
#存
q6 = Queue(3)
#方法1:
# print(q6.maxsize)#得到队列最大容量
# i = 0
# while i<q6.maxsize:
# q6.put(i)
# i+=1
#方法2:
while not q6.full():
q6.put(1,block=False)#非阻塞
'''------------------------------其它的属性和方法-----------------------------'''
q7 = Queue(3)
# q7.get(block=False)
print(time.time())
try:
q7.get(timeout=2)#阻塞时长
except:
pass
print(time.time())
q8 = Queue(3)
# q8.get_nowait()#强取
'''------------------------------优先级队列-----------------------------'''
q = PriorityQueue()
# 格式:q.put((数字,值))
#特点:数字越小,优先级越高
q.put((1,'lori'))
q.put((-1,'Jseon'))
q.put((10,'King'))
i = 0
while i<q.qsize():
print(q.get())
python 实现一个优先级队列
import heapq
class PriorityQueue(object):
def __init__(self):
self._queue = [] #创建一个空列表用于存放队列
self._index = 0 #指针用于记录push的次序
def push(self, item, priority):
"""队列由(priority, index, item)形式的元祖构成"""
heapq.heappush(self._queue, (-priority, self._index, item))
self._index += 1
def pop(self):
return heapq.heappop(self._queue)[-1] #返回拥有最高优先级的项
class Item(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Item: {!r}'.format(self.name)
if __name__ == '__main__':
q = PriorityQueue()
q.push(Item('foo'), 5)
q.push(Item('bar'), 1)
q.push(Item('spam'), 3)
q.push(Item('grok'), 1)
for i in range(4):
print(q._queue)
print(q.pop())
对队列进行4次pop()操作,打印结果如下:
[(-5, 0, Item: 'foo'), (-1, 1, Item: 'bar'), (-3, 2, Item: 'spam'), (-1, 3, Item: 'grok')]
Item: 'foo'
[(-3, 2, Item: 'spam'), (-1, 1, Item: 'bar'), (-1, 3, Item: 'grok')]
Item: 'spam'
[(-1, 1, Item: 'bar'), (-1, 3, Item: 'grok')]
Item: 'bar'
[(-1, 3, Item: 'grok')]
Item: 'grok'
可以观察出pop()是如何返回一个拥有最高优先级的项。对于拥有相同优先级的项(bar和grok),会按照 * 入队列的顺序来返回。
代码的核心是利用heapq模块,之前已经说过,heapq.heappop()会返回最小值项,因此需要把 priority 的值变为负,才能让队列将每一项按从最高到最低优先级的顺序级来排序。
python 优先队列PriorityQueue
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。
当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。通常采用堆数据结构来实现。
我们可以利用优先队列中元素被赋予优先级的这个特点来保存到当前状态下的若干个最大的元素值,这样优先级越高那么元素就可以先被处理,PriorityQueue属于queue模块中的一个类,其中经常使用到的有三个方法:声明一个优先队列、往优先队列中加入元素、往优先队列中移除元素
① 声明一个优先队列:queue.PriorityQueue()
② 往队列中加入元素:queue.put(self, item, block=True, timeout=None)
③ 往队列中删除元素:queue.get(self, block=True, timeout=None)
在往队列中加入元素的时候第一个元素值表示的是元素的优先级,并且值越小那么优先级越高,所以队首元素的优先级是最高的,而且经常加入队列的元素类型为元组这样就可以在队列中保存多个值,
下面是具体的例子
import queue
if __name__ == '__main__':
queue = queue.PriorityQueue()
queue.put((100, 100))
queue.put((-12, -7))
queue.put((7, 8))
while not queue.empty():
print(queue.get())
输出结果:
来源:https://blog.csdn.net/m0_37870649/article/details/103941434
猜你喜欢
- 一位资深的设计师曾经向我抱怨,说老板不仅让他做“设计”工作,还让他做“制作”工作,真是很烦。言下之意,“制作”还要一个资深设计师亲自上阵,未
- 在许多网页中,当鼠标移到一张图片上时,又弹出另一张图片,做这种广告条,要用到Macromedia Dr
- 说明Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码。从Python3.2开
- 由于Internet的历史原因,apin负责整个网络IP的整体规划以及北美区
- 两组字符串数据,需要比较其中相同的数据,并将其值相加并组成一个新的字符串数据a1="sp2=20;sp1=34;"a2=
- Asp中Server.ScriptTimeOut属性需要注意的一点Server.ScriptTimeout 这个属性给定Asp脚
- 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Pe
- 一 前言pandas学到分组迭代,那么基础的pandas系列就学的差不多了,自我感觉不错,知识追寻者用pandas处理过一些数据,蛮好用的;
- 在pycharm中我们有时需要切换python的版本,这里需要注意的是我们是在PyCharm中的Preferences中切换的,在File的
- VBSCRIPT中的日期,时间,星期函数很丰富,给我们使用带来了很大的方便,我个人使用最多的就是用now()来获取服务器的当前日期和时间。但
- 如下所示://动态删除select中的所有options: function delAllOptions(){&nb
- 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个。诸如此类的问
- 姓名的翻译: 英语是名(First name)在前,姓(Last name)在后。中文地址的翻译:如果你英语水平不高,填表时只要国家名用英语
- 在写代码过程中我们常常可能会遇到这样一种情况,要对一个list中的每个元素做同样的操作时,两种方法方法一:循环遍历每个元素 话不多说,上代码
- <input name="a" type="checkbox"
- Python lxml安装失败针对windows系统LXML安装失败而且pip升级也失败解决方案原因可能是pip没有安装到python我们需
- 大多的MySQL都是装在Linux上的,而我们的本机上一般都会装MySQL-Front.那如何用MySQL-Front连接远端Linux系统
- 1、看机器配置,指三大件:cpu、内存、硬盘2、看mysql配置参数3、查系mysql行状态,可以用mysqlreport工具来查看4、查看
- 先来看看什么是书签查找: 当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求。对
- 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降低单个对象向客户端同步的数据."九宫格"是最常