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模块可以避免手动处理锁和同步问题,提高开发效率和代码安全性。
发表评论