Queue模块介绍
Python的queue
模块提供了线程安全的队列实现,用于在多个线程之间安全地传递数据。它是Python标准库的一部分,特别适用于多线程编程场景。
为什么使用Queue?
- 线程安全:内置锁机制,保证多线程环境下的数据安全
- 简化同步:自动处理线程间的同步问题
- 多种队列类型:支持FIFO、LIFO和优先级队列
- 阻塞操作:当队列为空或满时自动阻塞线程
队列类型
Queue
先进先出队列(FIFO),最常用的队列类型
LifoQueue
后进先出队列(LIFO),类似于栈结构
PriorityQueue
优先级队列,按优先级顺序取出元素
基本使用方法
1. 导入模块
import queue
2. 创建队列
# 创建无限大小的队列 q = queue.Queue() # 创建最大容量为10的队列 q_limited = queue.Queue(maxsize=10)
3. 队列操作
方法 | 描述 | 示例 |
---|---|---|
put(item) |
添加元素到队列 | q.put('data') |
get() |
从队列取出元素 | item = q.get() |
empty() |
检查队列是否为空 | if q.empty(): ... |
full() |
检查队列是否已满 | if q.full(): ... |
qsize() |
返回队列当前大小 | size = q.qsize() |
LifoQueue与PriorityQueue
LifoQueue使用
import queue # 创建LIFO队列 stack = queue.LifoQueue() stack.put(1) # 入栈 stack.put(2) stack.put(3) print(stack.get()) # 输出: 3 (后进先出) print(stack.get()) # 输出: 2
PriorityQueue使用
import queue # 创建优先级队列 pq = queue.PriorityQueue() # 添加元素 (优先级, 数据) pq.put((3, 'Low priority')) pq.put((1, 'High priority')) pq.put((2, 'Medium priority')) # 按优先级顺序取出 print(pq.get()[1]) # 输出: High priority print(pq.get()[1]) # 输出: Medium priority print(pq.get()[1]) # 输出: Low priority
线程安全特性
queue模块的所有队列实现都是线程安全的,内部使用锁机制保证多线程环境下的数据一致性。
多线程生产者-消费者示例
import queue import threading import time # 创建队列 q = queue.Queue(maxsize=5) def producer(): for i in range(10): item = f"Item-{i}" q.put(item) print(f"生产者添加: {item}") time.sleep(0.1) def consumer(): while True: item = q.get() if item is None: # 结束信号 break print(f"消费者处理: {item}") q.task_done() # 标记任务完成 # 创建线程 producer_thread = threading.Thread(target=producer) consumer_thread = threading.Thread(target=consumer) # 启动线程 consumer_thread.start() producer_thread.start() # 等待生产者完成 producer_thread.join() # 发送结束信号 q.put(None) consumer_thread.join() print("所有任务完成")
实际应用示例
任务调度系统
import queue import threading import random class Task: def __init__(self, name, priority): self.name = name self.priority = priority def __lt__(self, other): return self.priority < other.priority # 创建优先级队列 task_queue = queue.PriorityQueue() def worker(): while True: task = task_queue.get() if task is None: break print(f"处理任务: {task.name} (优先级: {task.priority})") task_queue.task_done() # 启动工作线程 threads = [] for i in range(3): t = threading.Thread(target=worker) t.start() threads.append(t) # 添加任务 tasks = [ Task("备份数据库", 1), Task("生成报告", 3), Task("发送通知", 2), Task("清理缓存", 4), Task("紧急修复", 0) ] for task in tasks: task_queue.put(task) # 等待所有任务完成 task_queue.join() # 停止工作线程 for i in range(3): task_queue.put(None) for t in threads: t.join() print("所有任务处理完成")
总结
Python的queue
模块是处理多线程编程中数据交换的强大工具:
- 提供线程安全的队列实现
- 支持三种队列类型:Queue(FIFO)、LifoQueue(LIFO)和PriorityQueue
- 内置阻塞机制,简化线程同步
- 适合生产者-消费者模式
- 可用于任务调度、事件处理等场景
使用queue模块可以避免手动处理锁和同步问题,提高开发效率和代码安全性。
发表评论