Python队列Queue怎么使用

其他教程   发布日期:2025年03月24日   浏览次数:107

本文小编为大家详细介绍“Python队列Queue怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python队列Queue怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

queue模块简介

queue模块是Python内置的标准模块,模块实现了三种类型的队列,它们的区别仅仅是条目取回的顺序,分别由3个类进行表示,Queue,LifoQueue,PriorityQueue

queue.Queue(maxsize=0)

先进先出队列
maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

  1. from queue import Queue
  2. # FIFO
  3. queue_obj = Queue() # 创建一个队列对象
  4. for i in range(4):
  5. queue_obj.put(i)
  6. while not queue_obj.empty():
  7. print(queue_obj.get())
  8. # 输出顺序
  9. 0
  10. 1
  11. 2
  12. 3

queue.LifoQueue(maxsize=0)

后进先出,maxsize和Queue一样

  1. from queue import Queue,LifoQueue
  2. # LIFO
  3. queue_obj = LifoQueue() # 创建一个队列对象
  4. for i in range(4):
  5. queue_obj.put(i)
  6. while not queue_obj.empty():
  7. print(queue_obj.get())
  8. # 输出顺序
  9. 3
  10. 2
  11. 1
  12. 0

queue.PriorityQueue(maxsize=0)

优先级队列构造器,按照级别顺序取出元素,级别最低的最先取出
队列中的元素一般采取元组的形式进行存储(priority_number, data)

优先级不同数据部分可以比较大小

  1. PriorityQueue_obj = PriorityQueue()
  2. PriorityQueue_obj.put((5,45))
  3. PriorityQueue_obj.put((1,42))
  4. PriorityQueue_obj.put((2,47))
  5. while not PriorityQueue_obj.empty():
  6. print(PriorityQueue_obj.get())
  7. # 输出顺序
  8. (1, 42)
  9. (2, 47)
  10. (5, 45)

优先级一样,数据部分可以比较大小

  1. priorityQueue_obj = PriorityQueue()
  2. priorityQueue_obj.put((1,45))
  3. priorityQueue_obj.put((1,42))
  4. priorityQueue_obj.put((1,47))
  5. while not PriorityQueue_obj.empty():
  6. print(PriorityQueue_obj.get())
  7. (1, 42)
  8. (1, 45)
  9. (1, 47)
  10. priorityQueue_obj = PriorityQueue()
  11. priorityQueue_obj.put((1,[1,4]))
  12. priorityQueue_obj.put((1,[2,4]))
  13. priorityQueue_obj.put((1,[2,3]))
  14. while not PriorityQueue_obj.empty():
  15. print(PriorityQueue_obj.get())
  16. (1, [1, 4])
  17. (1, [2, 3])
  18. (1, [2, 4])
  19. 当优先级一样的时候,会在比较数据部分的大小,同上字符串也可以比较大小,

优先级一样,数据部分不可以比较大小
报错

  1. priorityQueue_obj = PriorityQueue()
  2. priorityQueue_obj.put((1,{"1":9}))
  3. priorityQueue_obj.put((1,{"k":6}))
  4. priorityQueue_obj.put((1,{"8":9}))
  5. while not priorityQueue_obj.empty():
  6. print(priorityQueue_obj.get()) # 没有字典不能直接比较大小
  7. # 报错内容
  8. # TypeError: '<' not supported between instances of 'dict' and 'dict'

如果想实现字典这类的比较或者改变其他数据类型的比较大小方式
需要自己实现一个类,将数据包装到类中,在类中自定义或
重写

  1. def __lt__(self, other):
魔法方法,其作用是实现同类对象进行“比较”的方法,在类进行比较的时候可以自动调用
  1. class dic:
  2. def __init__(self,level,data):
  3. self.level = level
  4. self.data = data
  5. def __lt__(self, other):
  6. if self.level == other.level:
  7. return len(self.data)<len(other.data)
  8. return self.level < other.level
  9. priorityQueue_obj = PriorityQueue()
  10. priorityQueue_obj.put(dic(5, {1:4, 2:5}))
  11. priorityQueue_obj.put(dic(4, {1:4}))
  12. priorityQueue_obj.put(dic(5, {1:2}))
  13. while not priorityQueue_obj.empty():
  14. print(priorityQueue_obj.get().data)
  15. # 结果
  16. {1: 4}
  17. {1: 2}
  18. {1: 4, 2: 5}

如果想避免麻烦,避免出现优先级一样的情况,就省去了一系列的问题

queue.SimpleQueue (3.7 新版功能.)

无界的 FIFO 队列构造函数。简单的队列,缺少任务跟踪等高级功能。

常用方法 Queue.qsize()

返回队列的大致大小。

  1. queue_obj = LifoQueue() # 创建一个队列对象
  2. for i in range(4):
  3. queue_obj.put(i)
  4. print(queue_obj.qsize())
  5. 结果
  6. 1
  7. 2
  8. 3
  9. 4
  • Queue.empty()

如果队列为空,返回 True ,否则返回 False 。

  • Queue.full()

如果队列是满的返回 True ,否则返回 False 。

  • Queue.put(item, block=True, timeout=None)

将 item 放入队列。如果可选参数 block 是 true 并且 timeout 是 None (默认),则在必要时阻塞至有空闲插槽可用。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。反之 (block 是 false),如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。

  • Queue.put_nowait(item)

相当于 put(item, block=False)。

  • Queue.get(block=True, timeout=None)

从队列中移除并返回一个项目。如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。

  • Queue.get_nowait()

相当于 get(block=False) 。

  • Queue.task_done()

在完成一项工作以后,task_done()告诉队列,该任务已处理完成

  • Queue.join()

阻塞至队列中所有的元素都被接收和处理完毕。
队列添加新工作时,未完成任务的计数就会增一,当调用task_done()函数后,就代表执行完一个工作,未完成任务的计数就会减一,当计数为0时 join() 阻塞被解除。

阻塞与抛出异常

添加元素发生阻塞

  1. queue_obj = Queue(3) # 队列的最大长度为3
  2. for i in range(4): # 当向队列中添加的元素超过队列的最大长度就会发生阻塞,当队列中取出一个数据才会解除堵塞
  3. queue_obj.put(i)
  4. # print(queue_obj.qsize())
  5. print("阻塞")
  6. queue_obj = Queue(3) # 创建一个队列对象
  7. for i in range(4):
  8. queue_obj.put(i,block=False) 当超出最大长度的时就会报错

取元素发生阻塞

  1. queue_obj = Queue(3)
  2. for i in range(3):
  3. queue_obj.put(i)
  4. for i in range(4): 当取出元素的时候发现没有元素的时候就会发生阻塞
  5. print(queue_obj.get())
  6. queue_obj = Queue(3)
  7. for i in range(3):
  8. queue_obj.put(i)
  9. for i in range(4):
  10. print(queue_obj.get(block=False)) 如果队列为空,仍然继续取元素,会发生报错

超时报错

  1. queue_obj = Queue(3)
  2. for i in range(4):
  3. queue_obj.put(i,timeout=4) # 如果阻塞4秒,原队列中仍然没有位置,则会发生报错

其他设置tiemout

以上就是Python队列Queue怎么使用的详细内容,更多关于Python队列Queue怎么使用的资料请关注九品源码其它相关文章!