本文目录导读:

我来为您展示Python中实现队列存储的多种方法,包括基础队列、优先队列和实际应用案例。
基础队列实现
使用collections.deque(推荐)
from collections import deque
import time
import random
class BasicQueue:
"""基础队列 - 使用deque实现"""
def __init__(self):
self.queue = deque()
def enqueue(self, item):
"""入队"""
self.queue.append(item)
print(f"入队: {item}")
def dequeue(self):
"""出队"""
if not self.is_empty():
item = self.queue.popleft()
print(f"出队: {item}")
return item
print("队列为空,无法出队")
return None
def peek(self):
"""查看队首元素"""
if not self.is_empty():
return self.queue[0]
return None
def is_empty(self):
"""判断队列是否为空"""
return len(self.queue) == 0
def size(self):
"""获取队列大小"""
return len(self.queue)
def display(self):
"""显示队列内容"""
print(f"队列内容: {list(self.queue)}")
print(f"队列大小: {self.size()}")
# 测试基础队列
def test_basic_queue():
print("=" * 40)
print("基础队列测试")
print("=" * 40)
q = BasicQueue()
# 入队操作
for i in range(1, 6):
q.enqueue(f"任务{i}")
q.display()
# 出队操作
print("\n开始出队...")
while not q.is_empty():
q.dequeue()
time.sleep(0.5)
q.display()
# test_basic_queue()
使用list实现的简单队列
class ListQueue:
"""使用list实现的简单队列"""
def __init__(self):
self.queue = []
def enqueue(self, item):
self.queue.append(item)
def dequeue(self):
if not self.is_empty():
return self.queue.pop(0)
return None
def is_empty(self):
return len(self.queue) == 0
def __str__(self):
return f"Queue: {self.queue}"
优先队列实现
import heapq
class PriorityQueue:
"""优先队列 - 使用heapq实现"""
def __init__(self):
self.queue = []
self.counter = 0 # 用于相同优先级时的稳定性
def enqueue(self, item, priority):
"""入队,priority越小优先级越高"""
heapq.heappush(self.queue, (priority, self.counter, item))
self.counter += 1
print(f"入队: {item} (优先级: {priority})")
def dequeue(self):
"""出队,返回优先级最高的元素"""
if not self.is_empty():
priority, _, item = heapq.heappop(self.queue)
print(f"出队: {item} (优先级: {priority})")
return item
return None
def peek(self):
"""查看队首元素"""
if not self.is_empty():
return self.queue[0][2]
return None
def is_empty(self):
return len(self.queue) == 0
def size(self):
return len(self.queue)
# 测试优先队列
def test_priority_queue():
print("\n" + "=" * 40)
print("优先队列测试")
print("=" * 40)
pq = PriorityQueue()
# 不同优先级的任务
tasks = [
("普通任务A", 3),
("紧急任务", 1),
("普通任务B", 3),
("重要任务", 2),
("低优先级任务", 5)
]
for task, priority in tasks:
pq.enqueue(task, priority)
print("\n开始处理任务...")
while not pq.is_empty():
pq.dequeue()
time.sleep(0.5)
# test_priority_queue()
实际应用案例
案例1:消息队列模拟
class MessageQueue:
"""消息队列 - 模拟发布/订阅模式"""
def __init__(self, name="default"):
self.name = name
self.queue = deque()
self.subscribers = []
self.processed_count = 0
def publish(self, message):
"""发布消息"""
message_id = f"MSG-{time.time()}-{random.randint(1000, 9999)}"
msg_data = {
'id': message_id,
'content': message,
'timestamp': time.time()
}
self.queue.append(msg_data)
print(f"[{self.name}] 发布消息: {message_id[:20]}... -> {message}")
return message_id
def subscribe(self, callback):
"""订阅消息"""
self.subscribers.append(callback)
print(f"[{self.name}] 新增订阅者: {callback.__name__}")
def consume(self):
"""消费一条消息"""
if not self.queue:
return None
message = self.queue.popleft()
self.processed_count += 1
# 通知所有订阅者
for subscriber in self.subscribers:
subscriber(message)
return message
def get_stats(self):
"""获取队列统计信息"""
return {
'name': self.name,
'pending': len(self.queue),
'processed': self.processed_count,
'subscribers': len(self.subscribers)
}
# 消息处理函数
def logger(message):
print(f" [日志] 记录消息: {message['content']}")
def email_sender(message):
print(f" [邮件] 发送邮件: {message['content']}")
def data_analyst(message):
print(f" [分析] 分析数据: {message['content']}")
def test_message_queue():
print("\n" + "=" * 40)
print("消息队列模拟")
print("=" * 40)
mq = MessageQueue("订单系统")
# 注册订阅者
mq.subscribe(logger)
mq.subscribe(email_sender)
mq.subscribe(data_analyst)
# 发布消息
messages = [
"新订单 #12345",
"订单 #12346 已支付",
"订单 #12345 已发货",
"用户反馈: 产品质量很好"
]
for msg in messages:
mq.publish(msg)
print()
# 消费消息
print("开始消费消息...")
while mq.queue:
mq.consume()
print("-" * 30)
time.sleep(0.5)
# 显示统计信息
stats = mq.get_stats()
print(f"\n队列统计: {stats}")
# test_message_queue()
案例2:任务调度器
class TaskScheduler:
"""任务调度器 - 带优先级的任务队列"""
def __init__(self, max_workers=3):
self.task_queue = PriorityQueue()
self.max_workers = max_workers
self.completed_tasks = []
self.task_id = 0
def add_task(self, name, duration, priority=5):
"""添加任务"""
self.task_id += 1
task = {
'id': self.task_id,
'name': name,
'duration': duration,
'priority': priority,
'added_time': time.time()
}
self.task_queue.enqueue(task, priority)
print(f"添加任务: {name} (ID: {self.task_id}, 耗时: {duration}s, 优先级: {priority})")
return self.task_id
def execute_next_task(self):
"""执行下一个任务"""
if self.task_queue.is_empty():
print("没有待执行的任务")
return None
task = self.task_queue.dequeue()
print(f"\n开始执行: {task['name']} (优先级: {task['priority']})")
# 模拟任务执行
time.sleep(min(task['duration'], 2)) # 最多等待2秒
task['completed_time'] = time.time()
task['actual_duration'] = task['completed_time'] - task['added_time']
self.completed_tasks.append(task)
print(f"✓ 完成: {task['name']} (耗时: {task['actual_duration']:.2f}s)")
return task
def run_all(self):
"""执行所有任务"""
print(f"\n开始执行所有任务 (最大并发: {self.max_workers})")
print("=" * 40)
while not self.task_queue.is_empty():
self.execute_next_task()
print("-" * 30)
print("\n所有任务执行完毕!")
self.show_results()
def show_results(self):
"""显示执行结果"""
print("\n执行结果汇总:")
print("=" * 40)
for task in self.completed_tasks:
print(f" [{task['id']}] {task['name']} - {task['actual_duration']:.2f}s (优先级: {task['priority']})")
total_time = sum(t['actual_duration'] for t in self.completed_tasks)
print(f"\n总任务数: {len(self.completed_tasks)}")
print(f"总耗时: {total_time:.2f}s")
def test_task_scheduler():
print("\n" + "=" * 40)
print("任务调度器测试")
print("=" * 40)
scheduler = TaskScheduler()
# 添加不同优先级的任务
scheduler.add_task("备份数据库", 3, priority=1)
scheduler.add_task("发送通知邮件", 2, priority=3)
scheduler.add_task("清理临时文件", 1, priority=5)
scheduler.add_task("生成报表", 4, priority=2)
scheduler.add_task("更新缓存", 2, priority=4)
# 执行所有任务
scheduler.run_all()
# test_task_scheduler()
案例3:银行排队系统
class Customer:
"""客户类"""
def __init__(self, name, service_type, is_vip=False):
self.name = name
self.service_type = service_type
self.is_vip = is_vip
self.arrival_time = time.time()
self.wait_time = 0
def __str__(self):
return f"{'VIP ' if self.is_vip else ''}{self.name} ({self.service_type})"
class BankQueueSystem:
"""银行排队系统"""
def __init__(self):
self.normal_queue = deque() # 普通客户
self.vip_queue = deque() # VIP客户
self.served_customers = [] # 已服务客户
self.counter_number = 0 # 当前叫号
def add_customer(self, name, service_type, is_vip=False):
"""添加客户到队列"""
customer = Customer(name, service_type, is_vip)
if is_vip:
self.vip_queue.append(customer)
queue_name = "VIP队列"
else:
self.normal_queue.append(customer)
queue_name = "普通队列"
print(f"{customer} 进入{queue_name}")
self.display_queue_status()
return customer
def serve_next(self):
"""服务下一个客户(VIP优先)"""
# VIP客户优先
if self.vip_queue:
customer = self.vip_queue.popleft()
elif self.normal_queue:
customer = self.normal_queue.popleft()
else:
print("没有客户在等待")
return None
# 计算等待时间
customer.wait_time = time.time() - customer.arrival_time
self.counter_number += 1
print(f"\n柜台 {self.counter_number}: 服务 {customer}")
print(f"等待时间: {customer.wait_time:.1f}秒")
# 模拟服务过程
service_time = random.uniform(1, 3)
time.sleep(min(service_time, 2)) # 最多等待2秒
customer.service_time = service_time
self.served_customers.append(customer)
print(f"✓ {customer} 服务完成 (耗时: {service_time:.1f}秒)")
self.display_queue_status()
return customer
def display_queue_status(self):
"""显示队列状态"""
print(f"\n当前队列状态:")
if self.vip_queue:
print(f" VIP队列: {len(self.vip_queue)}人")
for c in self.vip_queue:
print(f" - {c}")
else:
print(" VIP队列: 空")
if self.normal_queue:
print(f" 普通队列: {len(self.normal_queue)}人")
for c in list(self.normal_queue)[:3]: # 只显示前3个
print(f" - {c}")
if len(self.normal_queue) > 3:
print(f" ... 还有{len(self.normal_queue)-3}人")
else:
print(" 普通队列: 空")
print()
def test_bank_queue():
print("\n" + "=" * 40)
print("银行排队系统")
print("=" * 40)
bank = BankQueueSystem()
# 添加各种客户
customers = [
("张三", "存款", False),
("李四", "取款", False),
("王老板", "理财", True), # VIP客户
("赵六", "转账", False),
("刘总", "贷款", True), # VIP客户
("陈七", "开户", False),
("孙八", "销户", False)
]
print("开始排队...")
for name, service, is_vip in customers:
bank.add_customer(name, service, is_vip)
time.sleep(0.3)
print("\n开始服务客户...")
print("=" * 40)
# 服务所有客户
for i in range(len(customers)):
bank.serve_next()
time.sleep(0.5)
# 显示统计信息
print("\n" + "=" * 40)
print("服务统计:")
print("-" * 40)
total_wait = sum(c.wait_time for c in bank.served_customers)
avg_wait = total_wait / len(bank.served_customers) if bank.served_customers else 0
print(f"总服务客户数: {len(bank.served_customers)}")
print(f"平均等待时间: {avg_wait:.1f}秒")
print(f"VIP客户数: {sum(1 for c in bank.served_customers if c.is_vip)}")
# test_bank_queue()
完整示例主程序
# 取消注释下面的函数来运行对应的测试
if __name__ == "__main__":
print("Python队列实现示例")
print("=" * 50)
# 测试基础队列
test_basic_queue()
# 测试优先队列
test_priority_queue()
# 测试消息队列
test_message_queue()
# 测试任务调度器
test_task_scheduler()
# 测试银行排队系统
test_bank_queue()
这些示例展示了:
- 基础队列: 使用
deque和list实现FIFO队列 - 优先队列: 使用
heapq实现基于优先级的队列 - 实际应用: 消息队列、任务调度器、银行排队系统
您可以根据实际需求选择合适的队列实现方式来存储和管理数据。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播