
本文介绍如何将硬编码的多楼层等待逻辑重构为通用函数,消除重复代码,使停车模拟系统可动态扩展至任意楼层数量,并确保线程安全与状态一致性。
本文介绍如何将硬编码的多楼层等待逻辑重构为通用函数,消除重复代码,使停车模拟系统可动态扩展至任意楼层数量,并确保线程安全与状态一致性。
在当前的停车槽位模拟程序中,floor1_wait、floor2_wait 和 floor3_wait 三个函数结构高度相似——仅在队列对象(wq1/wq2/wq3)、楼层名称('Floor 1'/'Floor 2'/'Floor 3')和退出延迟(time.sleep(1)/2/3)上存在差异。这种重复不仅违背 DRY(Don’t Repeat Yourself)原则,更严重阻碍了系统扩展:每新增一层楼,就必须手动复制一份函数、声明新队列、创建新线程——极易出错且难以维护。
✅ 核心重构策略:参数化 + 状态解耦
关键在于将变化点提取为函数参数,同时解决两个关键问题:
-
共享状态安全访问:
floor_slots是字典,需按楼层名更新,不能直接传入整数值(否则无法回写); - 差异化延迟支持:不同楼层可配置独立等待时长,应从外部传入或查表。
以下是优化后的通用 floor_wait 函数:
def floor_wait(wq: queue.Queue, floor_name: str, exit_delay: float = 1.0):
"""
通用楼层等待处理函数
:param wq: 对应楼层的等待队列
:param floor_name: 楼层标识符(如 'Floor 1'),用于更新 floor_slots
:param exit_delay: 车辆驶出延迟(秒)
"""
while True:
try:
car = wq.get(timeout=1)
except queue.Empty:
continue
if car is None:
break
# 模拟停车等待时间
time.sleep(random.uniform(3, 8))
# 安全更新共享状态:使用 lock 确保原子性
with lock:
floor_slots[floor_name] += 1
oq.put(car)
update_data()
# 模拟驶出延迟(可按楼层定制)
time.sleep(exit_delay)
? 配置驱动:动态生成楼层资源
将楼层配置集中管理,避免硬编码队列与线程:
# 定义楼层配置(可从 JSON 或 UI 动态加载)
FLOOR_CONFIG = {
'Floor 1': {'queue': queue.Queue(), 'exit_delay': 1.0},
'Floor 2': {'queue': queue.Queue(), 'exit_delay': 2.0},
'Floor 3': {'queue': queue.Queue(), 'exit_delay': 3.0},
# 可轻松扩展:'Floor 4': {'queue': queue.Queue(), 'exit_delay': 2.5},
}
# 动态初始化队列引用(替代原 wq1/wq2/wq3 全局变量)
floor_queues = {name: config['queue'] for name, config in FLOOR_CONFIG.items()}
? 线程启动:一行代码启动全部楼层
使用列表推导式批量创建并启动线程,彻底消除重复:
# 启动所有楼层等待线程
floor_wait_threads = [
threading.Thread(
target=floor_wait,
args=(config['queue'], floor_name, config['exit_delay'])
)
for floor_name, config in FLOOR_CONFIG.items()
]
for t in floor_wait_threads:
t.start()
⚠️ 关键注意事项
-
lock必须用于所有floor_slots写操作:原代码中floor1_wait等函数未加锁就修改floor_slots,存在竞态风险。重构后务必在with lock:块内更新字典值。 -
队列信号传递需统一:停止信号
None应由stop_threads()向每个floor_queues[floor_name]发送,而非硬编码wq1.put(None)。 -
update_data()调用位置合理:它已在主线程(Tkinter)中安全调度,无需额外线程同步。 -
扩展性验证:只需修改
FLOOR_CONFIG字典,即可支持 10 层、50 层甚至动态加载楼层,无需改动任何业务逻辑。
✅ 总结
通过将重复逻辑抽象为参数化函数、将配置外置为字典结构、利用 Python 的高阶函数与列表推导式批量管理线程,本重构实现了:
- ✅ 零重复代码,维护成本大幅降低;
- ✅ 支持任意楼层数量,扩展性本质提升;
- ✅ 状态更新线程安全,规避数据竞争;
- ✅ 配置与逻辑分离,符合现代软件工程实践。
后续还可进一步封装为 ParkingSimulator 类,集成配置加载、线程生命周期管理及实时监控,让模拟系统真正具备工业级可维护性。










