Python 的 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()) # 输出 10
print(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 threading
import queue
import time
import 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:是否阻塞等待,默认 True
timeout:阻塞时的超时时间(秒)
返回:无。若队列已满且非阻塞模式,会抛出 queue.Full 异常
.get(block=True, timeout=None)
从队列中取出一个元素。
参数:
block:是否阻塞等待,默认 True
timeout:阻塞时的超时时间(秒)
返回:队列中的一个元素。若队列为空且非阻塞模式,会抛出 queue.Empty 异常
.put_nowait(item)
非阻塞地将元素放入队列,相当于 put(block=False)。
参数:item 为待入队元素
返回:无
.get_nowait()
非阻塞地从队列中取出一个元素,相当于 get(block=False)。
参数:无
返回:队列中的一个元素,若队列为空,抛出 queue.Empty
.empty()
判断队列是否为空。
参数:无
返回:布尔值
.full()
判断队列是否已满。
参数:无
返回:布尔值
.qsize()
返回当前队列中的元素数量。
参数:无
返回:整数(不一定完全准确,线程切换可能导致状态变化)
◆ ◆ ◆
补充说明
queue 模块为多线程程序提供了安全、高效的任务通信机制,避免了手动使用锁带来的复杂性。对于大多数并发队列应用,queue.Queue 已足够使用;若涉及优先级调度或栈结构,PriorityQueue 与 LifoQueue 提供了额外选择。在现代多线程任务分发中,是不可或缺的工具模块。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.