队列是一种先进先出的数据结构,与之对应的是堆栈这种后进先出的结构。但是在python中,它内置了一个queue模块,它不但提供普通的队列,还提供一些特殊的队列。具体如下:
- queue.Queue :先进先出队列
- queue.LifoQueue :后进先出队列
- queue.PriorityQueue :优先级队列
- queue.deque :双向队列
Queue:先进先出队列
这是最常用也是最普遍的队列,先看一个例子。
import queue
q = queue.Queue(maxsize)
q.put(11)
q.put(22)
q.put(33)
print(q.get())
print(q.get())
print(q.get())
Queue类的参数和方法:
maxsize
队列的最大元素个数,当队列内的元素达到这个值时,后来的元素默认会阻塞,等待队列腾出位置。
def __init__(self, maxsize=0):
self.maxsize = maxsize
self._init(maxsize)
qsize()
获取当前队列中元素的个数,也就是队列的大小
empty()
判断当前队列是否为空,返回True或者False
full()
判断当前队列是否已满,返回True或者False
put(self, block=True, timeout=None)
往队列里放一个元素,默认是阻塞和无时间限制的。如果,block设置为False,则不阻塞,这时,如果队列是满的,放不进去,就会弹出异常。如果timeout设置为n秒,则会等待这个秒数后才put,如果put不进去则弹出异常。
get(self, block=True, timeout=None)
从队列里获取一个元素。参数和put是一样的意思。
join()
阻塞进程,直到所有任务完成,需要配合另一个方法task_done。
def join(self):
with self.all_tasks_done:
while self.unfinished_tasks:
self.all_tasks_done.wait()
task_done()
表示某个任务完成。每一条get语句后需要一条task_done。
import queue
q = queue.Queue(5)
q.put(11)
q.put(22)
print(q.get())
q.task_done()
print(q.get())
q.task_done()
q.join()
LifoQueue:后进先出队列
类似于“堆栈”,后进先出。也较常用。
import queue
q = queue.LifoQueue()
q.put(123)
q.put(456)
print(q.get())
上述代码运行结果是:456
PriorityQueue:优先级队列
带有权重的队列,每个元素都是一个元组,前面的数字表示它的优先级,数字越小优先级越高,同样的优先级先进先出
q = queue.PriorityQueue()
q.put((1,"alex1"))
q.put((1,"alex2"))
q.put((1,"alex3"))
q.put((3,"alex3"))
print(q.get())
deque:双向队列
Queue和LifoQueue的“综合体”,双向进出。方法较多,使用复杂,慎用!
q = queue.deque()
q.append(123)
q.append(333)
q.appendleft(456)
q.pop()
q.popleft()