广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 队列Queue和PriorityQueue解析
  • 704
分享到

Python 队列Queue和PriorityQueue解析

2024-04-02 19:04:59 704人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录python 队列Queue和PriorityQueuePython的Queue模块优先级队列PriorityQueue的特点python 实现一个优先级队列pytho

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

输出结果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python 队列Queue和PriorityQueue解析

本文链接: https://www.lsjlt.com/news/120631.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 队列Queue和PriorityQueue解析
    目录Python 队列Queue和PriorityQueuePython的Queue模块优先级队列PriorityQueue的特点python 实现一个优先级队列pytho...
    99+
    2022-11-11
  • Python 队列Queue和Prior
    Python的Queue模块适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。 F...
    99+
    2023-01-31
    队列 Python Prior
  • Java的优先队列PriorityQueue详解
    Java中的优先队列是一种基于优先级的队列,元素按照优先级的顺序进行排序,具有较高优先级的元素在队列的头部,较低优先级的元素在队列的...
    99+
    2023-09-06
    Java
  • [python模块]队列queue
    一、队列queue队列queue 多应用在多线程场景,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue的线程安全的。因为queue使用了一个线程锁(pthread.Lock()),以及三个条件变量(pthread.cond...
    99+
    2023-01-31
    队列 模块 python
  • python消息队列Queue
    实例1:消息队列Queue,不要将文件命名为“queue.py”,否则会报异常“ImportError: cannot import name 'Queue'”#coding=utf-8 from multiprocessing impor...
    99+
    2023-01-31
    队列 消息 python
  • Python队列Queue超详细讲解
    目录queue模块简介queue.Queue(maxsize=0)queue.LifoQueue(maxsize=0)queue.PriorityQueue(maxsize=0)qu...
    99+
    2023-05-16
    Python队列Queue Python Queue
  • TP5 queue队列详解
    thinkphp-queue 笔记 前言一 代码示例 1.1 安装 thinkphp-queue1.2 搭建消息队列的存储环境1.3 配置消息队列的驱动1.4 消息的创建与推送1.5 消息的消费与删除1.6 ...
    99+
    2023-08-31
    php
  • JAVA队列( Queue ) 详解
    队列(Queue)是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素插入...
    99+
    2023-09-15
    Java
  • 详解python数据结构之队列Queue
    目录一、前言二、Queue的基本格式三、入队列函数 en_queue四、删除数据函数 de_queue一、前言 队列Queue是一种先进先出(FIFO,First In First ...
    99+
    2022-11-12
  • Python中线程安全队列Queue的示例分析
    小编给大家分享一下Python中线程安全队列Queue的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是队列?像排队一样,从头到尾排成一排,还可以有人继续往后排队,这就是队列。这里学委想说的是Queue这个...
    99+
    2023-06-29
  • Python中的优先队列(priority queue)和堆(heap)
    目录队列和优先队列(Priority Queue)堆(heap)简介初始化构建堆堆的插入(节点上浮)堆的删除(节点下浮)堆的应用队列和优先队列(Priority Queue) 队列是...
    99+
    2022-11-11
  • thinkphp5.0消息队列topthink/think-queue详解
    第一、安装topthink/think-queue composer require topthink/think-queue=1.1.6 第二、配置queue.php信息 找到应用目录下面的extra/queue.php进行配置,队列驱...
    99+
    2023-10-07
    php 开发语言
  • Java集合框架之PriorityQueue优先级队列实例分析
    这篇文章主要讲解了“Java集合框架之PriorityQueue优先级队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java集合框架之PriorityQueue优先级队列实例分析...
    99+
    2023-07-02
  • laravel源码分析队列Queue方法示例
    目录前言队列任务的创建队列任务的分发前言 队列 (Queue) 是 laravel 中比较常用的一个功能,队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求...
    99+
    2022-11-13
  • thinkphp6、thinkphp5.0 使用think-queue实现普通队列和延迟队列
    何为异步消息队列: 所谓消息队列,就是一个以队列数据结构为基础的一个实体,这个实体是真实存在的,比如程序中的数组,数据库中的表,或者redis等等,都可以。 异步队列的作用: 个人认为消息队列的主...
    99+
    2023-08-31
    redis php
  • Java 数据结构之队列(Queue)详解
    目录 1、在Java中有哪些常见的队列? 2、Queue 接口分析 3、Deque 接口分析 4、PriorityQueue 的实现原理详解 5、使用Java数组实现队列的简单示例 1、在Java中有哪些常见的队列?         在...
    99+
    2023-10-12
    java 队列 Queue 接口 Deque 接口
  • C++ Queue队列类模版实例详解
    目录1.队列的介绍2.代码实现3.测试运行总结1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO, First-I...
    99+
    2022-11-13
  • C++中Queue队列类模版的示例分析
    这篇文章主要介绍C++中Queue队列类模版的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.队列的介绍队列的定义队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO,...
    99+
    2023-06-29
  • laravel源码分析队列Queue方法怎么用
    本篇内容介绍了“laravel源码分析队列Queue方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!队列任务的创建先通过命令创建一个...
    99+
    2023-06-29
  • Python线程之线程安全的队列Queue
    目录一、什么是队列?二、队列基操 入队/出队/查队列状态三、Queue是一个线程安全的类一、什么是队列? 像排队一样,从头到尾排成一排,还可以有人继续往后排队,这就是队列。 这里学委...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作