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 []