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,是生产者-消费者模型的标准做法。
笔记加载中…