Python3 queue 模块
queue 模块提供线程安全的队列:多条线程同时 put/get 也不会互相踩踏。它自带阻塞与超时机制,是生产者-消费者模型、任务分发最常用的通信容器,标准库开箱即用。
Queue:先进先出队列
Queue 是 FIFO(先入先出)队列,最常用接口为 put(放入)、get(取出)、empty、qsize:
import queue
q = queue.Queue(maxsize=3) # maxsize 不指定则为无限
q.put("苹果")
q.put("香蕉")
print(q.qsize()) # 输出:2
print(q.empty()) # 输出:False
print(q.get()) # 输出:苹果(先进先出)
print(q.get()) # 输出:香蕉
print(q.empty()) # 输出:True
阻塞与超时
队列满时 put 会阻塞,队列空时 get 会阻塞,直到条件满足;不想无限等待可设 timeout,或用 put_nowait/get_nowait 立即返回并抛异常:
import queue
q = queue.Queue(maxsize=1)
q.put("已满") # 还能放入
try:
q.put_nowait("再来一个") # 队列满,立即抛 queue.Full
except queue.Full:
print("队列已满") # 输出:队列已满
try:
print(q.get_nowait()) # 队列非空,取出:已满
q.get_nowait() # 此时队列空,抛 queue.Empty
except queue.Empty:
print("队列已空") # 输出:队列已空
LifoQueue 与 PriorityQueue
后进先出用 LifoQueue(表现如栈);按优先级出队用 PriorityQueue,元素(常用元组)越小越先出:
import queue
stack = queue.LifoQueue() # 栈式队列
stack.put(1)
stack.put(2)
print(stack.get()) # 输出:2
pq = queue.PriorityQueue() # 优先队列
pq.put((3, "低优先级"))
pq.put((1, "高优先级"))
print(pq.get()) # 输出:(1, '高优先级')
生产者-消费者示例
生产线程往队列放数据,消费线程从队列取数据,两者通过队列解耦、互不阻塞对方:
import queue
import threading
import time
q = queue.Queue()
def producer():
for i in range(5):
q.put(f"任务{i}")
time.sleep(0.1)
def consumer():
while True:
task = q.get() # 队列空时阻塞等待
print("处理", task)
q.task_done() # 通知队列:本任务处理完毕
threading.Thread(target=producer).start()
threading.Thread(target=consumer, daemon=True).start()
q.join() # 等待所有 put 的任务都被处理
print("全部处理完毕") # 输出:全部处理完毕
与 collections.deque 的区别
- deque:通用双端队列,两端增删都很快,但它本身不保证线程安全,也没有阻塞等待;
- Queue:专为线程通信设计,内部自带锁,put/get 可阻塞,还有 task_done/join 协作机制。 单线程内部用 deque 即可;多线程任务分发请用 queue.Queue。 小结:Queue 是线程安全的 FIFO 队列,LifoQueue、PriorityQueue 覆盖栈与优先级场景;配合 put/get 阻塞与 task_done/join,是生产者-消费者模型的标准做法。