什么是 Queue?
在 Python3 中,queue 模块提供了多生产者、多消费者队列的线程安全实现,
常用于多线程编程中协调线程之间的数据传递。
它是线程安全的,无需额外加锁,非常适合在并发环境中使用。
Queue 的主要类型
- Queue:先进先出(FIFO)队列。
- LifoQueue:后进先出(LIFO)队列,类似栈。
- PriorityQueue:优先级队列,元素按优先级出队。
基本用法示例
1. FIFO 队列(Queue)
import queue
q = queue.Queue()
q.put('first')
q.put('second')
q.put('third')
print(q.get()) # 输出: first
print(q.get()) # 输出: second
2. LIFO 队列(LifoQueue)
import queue
stack = queue.LifoQueue()
stack.put('A')
stack.put('B')
stack.put('C')
print(stack.get()) # 输出: C
print(stack.get()) # 输出: B
3. 优先级队列(PriorityQueue)
import queue
pq = queue.PriorityQueue()
pq.put((2, 'medium priority'))
pq.put((1, 'high priority'))
pq.put((3, 'low priority'))
print(pq.get()) # 输出: (1, 'high priority')
print(pq.get()) # 输出: (2, 'medium priority')
常用方法
put(item):将 item 放入队列。get():从队列取出并移除一个元素。qsize():返回队列当前元素数量(注意:在多线程中可能不准确)。empty():判断队列是否为空。full():判断队列是否已满(仅当初始化时指定了 maxsize)。task_done()与join():用于任务同步(常用于生产者-消费者模型)。
多线程实战示例
以下是一个简单的生产者-消费者模型:
import threading
import queue
import time
def producer(q):
for i in range(5):
q.put(f"item-{i}")
print(f"Produced item-{i}")
time.sleep(0.5)
def consumer(q):
while True:
item = q.get()
if item is None:
break
print(f"Consumed {item}")
q.task_done()
q = queue.Queue()
t1 = threading.Thread(target=producer, args=(q,))
t2 = threading.Thread(target=consumer, args=(q,))
t1.start()
t2.start()
t1.join()
q.join() # 等待所有任务完成
q.put(None) # 通知消费者退出
注意事项
queue模块专为多线程设计,不是用于多进程(多进程请使用multiprocessing.Queue)。- 避免在单线程程序中过度使用
queue,普通 list 或 collections.deque 可能更高效。 - 使用
get()和put()时默认会阻塞,可设置block=False或使用超时参数。