queue模块–队列
from queue import Queue,LifoQueue,PriorityQueue#三种队列
Queue
Queue是先进先出(first-in first-out)队列。
Queue(maxsize=0)
- 创建FIFO队列,返回Queue对象
- maxsize <= 0时,队列长度没有限制
Queue.get(block=True, timeout=None)
- 从队列中移除元素并返回这个元素
- block为阻塞,timeout为超时
- 如果block为True,是阻塞,timeout为None就是一直阻塞
- 如果block为True,但是timeout有值,就阻塞到一定秒数抛出Empty异常
- block为False,是非阻塞,timeout将被忽略,要么成功返回一个元素,要么抛出Empty异常
Queue.get_nowait()
- 等价于get(block=False)
- 但是queue的这种阻塞效果,需要多线程来演示
Queue.put(item, block=True, timeout=None)
- 把一个元素加入到队列中去
- block=True,timeout=None,一直阻塞直至有空位放元素
- block=True,timeout=5,阻塞5秒就抛出Full异常(满了)
- block=False,timeout失效,立即返回,能塞进去就塞,不能则返回抛出Full异常。
Queue.put_nowait(item)
- 等价于put(item,block=False)
from queue import Queue
q = Queue(2)#设置队列大小为2
q.put('a')
q.put('c')
#q.put('c',block=True,timeout=3)#超出队列大小,线程等待3秒后抛出Full异常
print(q.empty(),q.full(),q.qsize(),q.maxsize)
q.get()
q.get()
print(q.empty(),q.full(),q.qsize(),q.maxsize)
#q.get(block=True,timeout=3)#如果从空队列里弹出,线程等待3秒后抛出Empty异常
#控制台输出
#False True 2 2
#True False 0 2
LifoQueue
后进先出队列,这个类继承自Queue,使用方式同Queue。
PriorityQueue
优先队列,这个类也继承自Queue类,并重写了入队,出对的方法。
- 它里面是堆,用列表实现的堆,构建的是小顶堆
- 元素可以存储任意值,但是优先队列内部是直接进行元素大小比较的,不同类型比较可能抛出异常
- 入队时,将元素加入到列表末尾。然后进行小顶堆调整
- 出队时,将索引0既堆顶出最小的值和列表最后一个值调换,并弹出末尾值,再重新堆调整
时,将元素加入到列表末尾。然后进行小顶堆调整
- 出队时,将索引0既堆顶出最小的值和列表最后一个值调换,并弹出末尾值,再重新堆调整