我的GitHub
Python的queue
模块提供了多种队列的实现,包括先进先出(FIFO)队列、后进先出(LIFO)队列,以及优先队列。它们通常用于在多线程环境中实现线程间的安全通信。以下是各种队列类型的基本用法:
FIFO队列(Queue)
from queue import Queue
# 创建一个队列
q = Queue()
# 向队列中放入元素
q.put(1)
q.put(2)
q.put(3)
# 从队列中取出元素
print(q.get()) # 输出: 1
print(q.get()) # 输出: 2
print(q.get()) # 输出: 3
LIFO队列(LifoQueue)
from queue import LifoQueue
# 创建一个LIFO队列
q = LifoQueue()
# 向队列中放入元素
q.put(1)
q.put(2)
q.put(3)
# 从队列中取出元素
print(q.get()) # 输出: 3
print(q.get()) # 输出: 2
print(q.get()) # 输出: 1
优先队列(PriorityQueue)
from queue import PriorityQueue
# 创建一个优先队列
q = PriorityQueue()
# 向队列中放入元素,每个元素都是一个元组,其中第一个元素是优先级
q.put((2, "B"))
q.put((1, "A"))
q.put((3, "C"))
# 从队列中取出元素
print(q.get()[1]) # 输出: A
print(q.get()[1]) # 输出: B
print(q.get()[1]) # 输出: C
其他方法
q.empty()
: 返回True
如果队列为空,否则返回False
。q.full()
: 如果队列已满返回True
,否则返回False
。q.queue
: 表示队列内部数据的列表,通常不建议直接访问。
队列对象还有其他一些方法和参数,但以上是最常用的基础操作。
注意:queue
模块是线程安全的,意味着多个线程可以安全地同时从同一个队列实例中添加或者删除元素。如果队列为空,get()
操作会阻塞,直到有元素可取。同样地,如果队列满了,put()
操作也会阻塞,直到有空位可放。这两种行为都可以通过设置额外的参数来改变。
怎么限制队列大小?
在Python的queue
模块中,你可以通过设置maxsize
参数来限制队列大小。当队列达到最大容量时,后续的put
操作将会被阻塞,直到队列中有可用空间。以下是一个例子:
from queue import Queue
# 创建一个大小为3的队列
q = Queue(maxsize=3)
# 向队列中添加元素
q.put(1)
q.put(2)
q.put(3)
# 此时,队列已满。下面的操作将会阻塞,除非设置了timeout或者队列中有可用空间
# q.put(4)
# 检查队列是否已满
print(q.full()) # 输出:True
# 从队列中取出元素,这将为新元素提供空间
print(q.get()) # 输出:1
# 现在队列又有空间,所以这个操作不会阻塞
q.put(4)
# 打印队列内容(这是一种不推荐的操作,仅用于演示)
print(list(q.queue)) # 输出:[2, 3, 4]
使用maxsize
设置为0或负数,表示队列大小没有限制。
注意:put
和get
方法也有一个timeout
参数,你可以设置这个参数以避免无限期地等待。例如,q.put(4, timeout=1)
将会在等待1秒后,如果没有可用空间,抛出一个queue.Full
异常。同样地,q.get(timeout=1)
也有类似的行为,但会抛出queue.Empty
异常。