python系列之Queue模块简介

287 阅读3分钟

Queue是python标准库中的线程安全队列,提供了一个适用于多线程编程的数据结构。用于在多个线程之间进行消息传递。主要包含了LILO队列(先进先出队列)、LIFO队列(后进先出队列)、PriorityQueue队列(优先级队列)

1.LILO队列(先进先出队列)

1.1 构造方法

Queue([maxsize]):maxsize是队列中允许最大项数,省略则为无限大队列

1.2 实例方法

put():用来在队列中插入数据。该方法有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,该方法会阻塞timeout的时间,直到该队列有剩余的空间。超时抛出Queue.Full异常。若blocked的值为False,且Queue已满,则会立即抛出Queue.Full异常

get():从队列获取一个元素并且删除该元素,类似于列表的pop()方法。该方法也有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,会在timeout的时间内没有获取到抛出Queue.Empty异常。若blocked的值为False,且队列有一个元素可用,则返回该元素。若blocked的值为False,且队列为空则抛出Queue.Empty异常。设置blocked的值为True或者参数全部置空可以防止Queue在empty的时候抛出异常。

put_nowait():同put(blcoked=False)

get_nowait():同get(blcoked=False)

empty():判断队列是否为空。但是该方法在队列为空返回True时不可靠,比如返回True时put()方法插入了新的数据。

full():判断队列是否已满,该方法也不可靠,比如返回True时get()方法取走了数据。

qsize():返回队列中目前元素的数量,也不可靠,原因同empty()和full()

1.3 实际例子

from queue import Queue
​
# 创建一个队列对象
q = Queue()
# 在队列尾部插入元素
q.put('a')
q.put('b')
q.put('c')
# 查看队内所有的元素
print(q.queue)
# 返回并删除队列的头部元素
print(q.get(), q.queue)
print(q.get(), q.queue)
print(q.get(), q.queue)

result:

deque(['a', 'b', 'c'])
a deque(['b', 'c'])
b deque(['c'])
c deque([])

2.LIFO队列(后进先出队列)

2.1 构造方法

LifoQueue([maxsize]):maxsize是队列中允许最大项数,省略则为无限大队列

2.2 实例方法

同1.1,这里不再赘述

2.3 实际例子

from queue import LifoQueue
​
# 创建一个队列对象
q = LifoQueue()
# 在队列尾部插入元素
q.put('a')
q.put('b')
q.put('c')
# 查看队内所有的元素
print(q.queue)
# 返回并删除队列的头部元素
print(q.get(), q.queue)
print(q.get(), q.queue)
print(q.get(), q.queue)

result:

['a', 'b', 'c']
c ['a', 'b']
b ['a']
a []

3.PriorityQueue队列(优先级队列)

3.1 构造方法

PriorityQueue([maxsize]):maxsize是队列中允许最大项数,省略则为无限大队列

3.2 实例方法

同1.1,这里不再赘述

3.3 实际例子

from queue import PriorityQueue
​
# 创建一个队列对象
q = PriorityQueue(maxsize=0)
# 在队列尾部插入元素
q.put(3)
q.put(21)
q.put(162)
q.put(-9)
# 查看队内所有的元素
print(q.queue)
# 返回并删除队列的头部元素
print(q.get(), q.queue)
print(q.get(), q.queue)
print(q.get(), q.queue)
print(q.get(), q.queue)

result:

[-9, 3, 162, 21]
-9 [3, 21, 162]
3 [21, 162]
21 [162]
162 []