Python队列(queue)模块详解
Python中队列(queue)是处理多线程中共享资源问题的一个重要工具,它遵循FIFO(先进先出)的原则,即先进入的数据先输出,而后进入的数据后输出。队列支持队列大小,以防止过度使用特定的内存资源。
Python中的队列实现为Queue模块,其中包含了三种队列类型:
- FIFO队列(先进先出)
- LIFO队列(后进先出),也叫做堆栈
- 优先级队列(具有优先级顺序)
队列(queue)基本方法
以下是Queue模块中最重要的类和方法:
Queue(maxsize=0)
Queue类实现了所有基本的队列功能。maxsize是一个整数,用于设置可以放置在队列中的项目数。如果插入到队列中的项目数达到了maxsize,则插入操作将被阻塞,直到队列中的某个项目被删除,使有空间可用。
import queue
q = queue.Queue(maxsize=3)
q.put(1)
q.put(2)
q.put(3)
print(q.full()) # True
q.put(4, block=False) # 由于队列已满,插入操作出发了queue.Full异常
while not q.empty():
print(q.get(), end=' ') # 输出1 2 3
LifoQueue(maxsize=0)
LifoQueue类实现了堆栈的功能。Stack类是LifoQueue的别名。它的构造方法与Queue相同,但默认的maxsize为0(无大小限制)。
import queue
lq = queue.LifoQueue(maxsize=3)
lq.put(1)
lq.put(2)
lq.put(3)
print(lq.full()) # True
lq.put(4, block=False) # 由于堆栈已满,插入操作出发了queue.Full异常
while not lq.empty():
print(lq.get(), end=' ') # 输出3 2 1
PriorityQueue(maxsize=0)
PriorityQueue类实现了一个优先级队列。默认情况下,优先级值小的元素优先级高。队列中的每个元素必须是一个元组,其中第一个元素是优先级值(必须是数字类型),第二个元素是数据。
import queue
pq = queue.PriorityQueue(maxsize=3)
pq.put((1, '一'))
pq.put((2, '二'))
pq.put((3, '三'))
print(pq.full()) # True
pq.put((4, '四'), block=False) # 由于队列已满,插入操作出发了queue.Full异常
while not pq.empty():
print(pq.get()[1], end=' ') # 输出一 二 三
队列(queue)其他方法
队列(Queue)数据结构还提供了许多其他方法,常用的有:
方法 | 描述 |
---|---|
qsize() | 返回队列的大小。当没有数量限制时,返回的值为0。 |
empty() | 如果队列为空,返回True,否则返回False。 |
full() | 如果队列满了,返回True,否则返回False。 |
get([block[, timeout]]) | 获取队列中的一项。如果队列为空,block为True(默认值)则等待,直到队列中有一个项目为止。 |
get_nowait() | 相当于get(False)。 |
put(item[, block[, timeout]]) | 将一项添加到队列的尾部。如果队列已满,block为True(默认值)则等待。 |
put_nowait(item) | 相当于put(item, False)。 |
task_done() | 表示先前提交给队列的异步任务已经完成。 |
join() | 阻塞调用线程,直到队列中的所有项目都被处理完(task_done()的调用次数等于项目的数量),才会继续运行。 |
总结
队列是多线程和协程编程中的重要工具,它是线程安全的,被多个线程和协程共享。Python提供了Queue模块来实现队列。Queue模块包含三种队列:FIFO、LIFO和优先级队列。队列(Queue)数据结构提供了许多方法,允许使用者控制队列的大小、检查队列状态以及添加和删除队列项目。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python队列queue模块详解 - Python技术站