python内置的queue模块实现了三种类型的队列,因此没有必要重复造轮子,它们的区别仅仅是条目取回的顺序。在 FIFO 队列中,先添加的任务先取回。在 LIFO 队列中,最近被添加的条目先取回(操作类似一个堆栈)。优先级队列中,条目将保持排序( 使用 heapq 模块 ) 并且最小值的条目第一个返回。
class queue.Queue(maxsize=0)
- 1.
FIFO 先入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。
maxsize is an integer that sets the upperbound limit on the number of items that can be placed in the queue.
class queue.LifoQueue(maxsize=0)
- 1.
- 2.
LIFO 后入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。
class queue.PriorityQueue(maxsize=0)
- 1.
PriorityQueue优先级队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。
通用方法:
Queue.qsize() 返回队列的大致大小
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, False) 。
Queue.get(block=True, timeout=None) 从队列中移除并返回一个项目。
如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。
如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。
反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。
Queue.get_nowait() 相当于 get(False) 。
提供了两个方法,用于支持跟踪 排队的任务 是否 被守护的消费者线程 完整的处理。
Queue.task_done()
- 1.
表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。
如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。
如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。
Queue.join()
- 1.
阻塞至队列中所有的元素都被接收和处理完毕。
当条目添加到队列的时候,未完成任务的计数就会增加。
每当消费者线程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。
当未完成计数降到零的时候, join() 阻塞被解除。
代码如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# _ooOoo_
# o8888888o
# 88" . "88
# ( | - _ - | )
# O\ = /O
# ____/`---'\____
# .' \\| |// `.
# / \\|||:|||// \
# / _|||||-:- |||||- \
# | | \\\ - /// | |
# | \_| ''\---/'' | _/ |
# \ .-\__ `-` ___/-. /
# ___`. .' /--.--\ `. . __
# ."" '< `.___\_<|>_/___.' >'"".
# | | : `- \`.;`\ _ /`;.`/ - ` : | |
# \ \ `-. \_ __\ /__ _/ .-` / /
# ==`-.____`-.___\_____/___.-`____.-'==
# `=---='
'''
@Project :pythonalgorithms
@File :queuedatastructure.py
@Author :不胜人生一场醉
@Date :2021/7/15 1:53
'''
from queue import Queue, LifoQueue, PriorityQueue, SimpleQueue
import random
if __name__ == '__main__':
q = Queue() # 先进先出队列
lq = LifoQueue() # 先进后厨队列
pq = PriorityQueue() # 优先级队列
sq = SimpleQueue() # 简单队列
# 插入队列数据
for i in range(10):
q.put(i)
lq.put(i)
pq.put(random.randint(1, 20), i)
sq.put(i)
for i in range(10):
print(q.get(), end=' ')
# 0 1 2 3 4 5 6 7 8 9
print('\r')
for i in range(10):
print(lq.get(), end=' ')
# 9 8 7 6 5 4 3 2 1 0
print('\r')
for i in range(10):
print(pq.get(), end=' ')
# 6 7 13 16 17 18 18 19 20 20
print('\r')
for i in range(10):
print(sq.get(), end=' ')
# 0 1 2 3 4 5 6 7 8 9
q = Queue(3)
print('\r')
print('queue.qsize=', q.qsize())
# queue.qsize= 0
print('queue.empty=', q.empty())
# queue.empty= True
q.put(5)
q.put(9)
q.put(1)
print('queue.full=', q.full())
# queue.full= True
# q.put(10)
# print(q)
# q.put(11,block=True,timeout=1) #在timeout=1秒左右,返回 raise Full
# print(q)
# q.put(11, block=False, timeout=1) # 立刻 返回 raise Full,忽略时间
# print(q)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
输出结果为: