page contents

Python 库手册:queue 线程安全队列模块!

Python 的 queue 模块提供了线程安全的队列类,是构建多线程程序时处理任务调度、生产者-消费者模型的理想选择。它支持先进先出(FIFO)、后进先出(LIFO)以及优先级队列等结构,确保多个线程之间安全地共享数据。

attachments-2025-07-NdVoYGcI687d963051ac2.jpgPython 的 queue 模块提供了线程安全的队列类,是构建多线程程序时处理任务调度、生产者-消费者模型的理想选择。它支持先进先出(FIFO)、后进先出(LIFO)以及优先级队列等结构,确保多个线程之间安全地共享数据。

常见应用场景:(1)多线程环境中任务调度与线程通信。(2)构建生产者-消费者模型。(3)需要线程间共享数据但避免使用显式锁。(4)需要带有优先级的任务队列

核心概念

1、线程安全(Thread-safe)所有队列操作都是原子级,内部使用锁机制,无需额外加锁。

2、三种队列类型

Queue:先进先出队列(FIFO)LifoQueue:后进先出队列(栈结构)PriorityQueue:按优先级出队,较小值优先

3、队列满/空时阻塞与非阻塞入队和出队操作可选择是否阻塞,默认阻塞直到成功。

4、可设置最大队列长度(maxsize)防止无限增长导致内存溢出。

应用举例

例 1:基础 FIFO 队列操作import queue

q = queue.Queue(maxsize=3)  # 创建容量为3的队列

q.put(10)q.put(20)q.put(30)

print(q.get())  # 输出 10print(q.get())  # 输出 20

例 2:非阻塞取出元素import queue

q = queue.Queue()q.put(1)

try:    item = q.get_nowait()  # 非阻塞读取    print(item)except queue.Empty:    print("队列为空")

例 3:使用 LifoQueue 实现栈结构import queue

s = queue.LifoQueue()s.put('A')s.put('B')s.put('C')

print(s.get())  # 输出 C(后进先出)

例 4:使用 PriorityQueue 实现优先级任务调度

import queue

pq = queue.PriorityQueue()pq.put((2, "中等优先级"))pq.put((1, "高优先级"))pq.put((3, "低优先级"))

while not pq.empty():    print(pq.get()[1])# 输出顺序:高优先级 -> 中等优先级 -> 低优先级

例 5:多线程中的生产者-消费者模型

import threadingimport queueimport timeimport random

# 创建一个共享队列task_queue = queue.Queue(maxsize=5)

# 生产者函数def producer(name):    for i in range(10):        item = f"{name}-任务{i}"        task_queue.put(item)        print(f"[生产者{name}] 生产了 {item}")        time.sleep(random.uniform(0.1, 0.5))  # 模拟生产时间

# 消费者函数def consumer(name):    while True:        try:            item = task_queue.get(timeout=2)  # 等待任务            print(f"    [消费者{name}] 消费了 {item}")            task_queue.task_done()  # 标记任务完成            time.sleep(random.uniform(0.2, 0.6))  # 模拟处理时间        except queue.Empty:            break

# 创建线程producer_thread = threading.Thread(target=producer, args=("A",))consumer_threads = [    threading.Thread(target=consumer, args=("X",)),    threading.Thread(target=consumer, args=("Y",))]

# 启动线程producer_thread.start()for t in consumer_threads:    t.start()

# 等待所有线程结束producer_thread.join()task_queue.join()  # 等待所有任务完成print("所有任务处理完成")

常用方法与属性

Queue(maxsize=0)

创建一个先进先出的线程安全队列。参数:maxsize:最大容量,0 表示无限制返回:一个 Queue 对象

.put(item, block=True, timeout=None)

将一个元素放入队列。参数:item:要加入队列的元素block:是否阻塞等待,默认 Truetimeout:阻塞时的超时时间(秒)返回:无。若队列已满且非阻塞模式,会抛出 queue.Full 异常

.get(block=True, timeout=None)

从队列中取出一个元素。参数:block:是否阻塞等待,默认 Truetimeout:阻塞时的超时时间(秒)返回:队列中的一个元素。若队列为空且非阻塞模式,会抛出 queue.Empty 异常

.put_nowait(item)

非阻塞地将元素放入队列,相当于 put(block=False)。参数:item 为待入队元素返回:无

.get_nowait()

非阻塞地从队列中取出一个元素,相当于 get(block=False)。参数:无返回:队列中的一个元素,若队列为空,抛出 queue.Empty

.empty()

判断队列是否为空。参数:无返回:布尔值

.full()

判断队列是否已满。参数:无返回:布尔值

.qsize()

返回当前队列中的元素数量。参数:无返回:整数(不一定完全准确,线程切换可能导致状态变化)

补充说明

queue 模块为多线程程序提供了安全、高效的任务通信机制,避免了手动使用锁带来的复杂性。对于大多数并发队列应用,queue.Queue 已足够使用;若涉及优先级调度或栈结构,PriorityQueue 与 LifoQueue 提供了额外选择。在现代多线程任务分发中,是不可或缺的工具模块。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-07-21 09:22
  • 阅读 ( 38 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章