Python queue 模块

FIFO/LIFO/priority queues, blocking semantics, and the task_done protocol.

Intermediate
Key Points`queue.Queue` is already thread-safe — the usual bug is forgetting `task_done()`, which makes `join()` hang forever.

Three Queue Types

ClassOrderUse for
QueueFIFOTask pipeline
LifoQueueLIFOUndo stack, DFS
PriorityQueueLowest value firstScheduling by priority
Python
import queue

q = queue.Queue(maxsize=3)
q.put("a"); q.put("b")
print(q.get(), q.qsize())

pq = queue.PriorityQueue()
pq.put((2, "low"))
pq.put((1, "high"))
print(pq.get())
Output
a 1
(1, 'high')

Producer / Consumer

get() blocks when empty; get_nowait() raises Empty. Consumers must call task_done() or join() never returns.

Python
import queue
import threading

q = queue.Queue()


def worker():
    while True:
        item = q.get()
        if item is None:
            q.task_done()
            break
        print("handled", item)
        q.task_done()


t = threading.Thread(target=worker, daemon=True)
t.start()
for i in range(3):
    q.put(i)
q.put(None)          # 结束哨兵
q.join()
print("all done")
Output
handled 0
handled 1
handled 2
all done
Always set maxsize — an unbounded queue eats all memory when consumers lag. A bound gives you backpressure for free.

Friends & Partners