2023-08-25 03:28:32
在 Python 中,使用 queue 模块可实现线程安全的队列操作,尤其适用于多线程编程中的数据传递。以下是具体使用方法和关键要点:
一、queue 模块概述Queue:先进先出(FIFO)队列。
LifoQueue:后进先出(LIFO)队列。
PriorityQueue:优先级队列(按元素优先级排序)。

put(item, block=True, timeout=None):
将元素放入队列,支持阻塞和超时。
若队列满且 block=True,会阻塞直到有空间;若 timeout 指定,超时后抛出 queue.Full 异常。
q = queue.Queue(maxsize=2)try: q.put("a", timeout=2) q.put("b", timeout=2) q.put("c", timeout=2) # 抛出 queue.Full 异常except queue.Full: print("队列已满")get(block=True, timeout=None):
从队列取出元素,支持阻塞和超时。
若队列空且 block=True,会阻塞直到有数据;若 timeout 指定,超时后抛出 queue.Empty 异常。
q = queue.Queue()q.put("item1")try: item = q.get(timeout=3) # 输出 "item1"except queue.Empty: print("队列为空")支持阻塞操作(避免手动轮询)。
提供超时机制(防止无限等待)。
多种队列类型(FIFO/LIFO/Priority)。
task_done() 与 join() 配合:
忘记调用 task_done() 会导致 join() 永久阻塞。
建议在 try...finally 中调用 task_done(),确保异常时也能标记任务完成。
while True: item = q.get() try: process(item) finally: q.task_done()队列大小限制:
通过 maxsize 参数限制队列容量,避免内存耗尽。
合理设置超时时间,防止线程因队列满/空而长期阻塞。
put()/get():入队/出队。
task_done()/join():任务同步。
合理使用 queue 模块可显著提升多线程程序的可靠性和可维护性。