Python故障消息发送:机器无需感知全系统的邻居通知方案
嘿,我来帮你搞定这个邻居故障通知的问题!核心痛点就是要让机器不用感知整个系统,只和自己的邻居打交道对吧?咱们直接上解决方案:
核心思路:给机器绑定专属邻居列表
你需要让每个机器实例只持有自己的邻居引用列表,完全不用管系统里有多少其他设备。故障时机器只需要遍历自己的邻居列表发通知,彻底和全局系统解耦。
修改后的可运行代码示例
我把你的代码补全并做了关键修改,直接就能跑:
import simpy import random random_seed = 42 MTTF = 3500 # 平均故障间隔时间 REPAIR_TIME = 500 # 修复时长 class Machine: def __init__(self, env, name, neighbors): self.env = env self.name = name self.neighbors = neighbors # 只存自己的邻居,不碰全局系统 self.is_running = True # 启动机器运行进程 self.process = env.process(self.run()) def run(self): while True: # 模拟正常运行到故障的时间 time_to_failure = random.expovariate(1/MTTF) yield self.env.timeout(time_to_failure) # 触发故障逻辑 self.is_running = False print(f"[{self.env.now:.2f}] {self.name} 挂了!请求邻居协助") # 给所有邻居发故障通知 self.notify_neighbors() # 模拟修复过程 yield self.env.timeout(REPAIR_TIME) self.is_running = True print(f"[{self.env.now:.2f}] {self.name} 修好啦,恢复运行") # 给邻居发恢复通知 self.notify_neighbors(status="恢复") def notify_neighbors(self, status="故障"): for neighbor in self.neighbors: # 让邻居异步处理通知 self.env.process(neighbor.handle_notification(self.name, status)) def handle_notification(self, sender_name, status): print(f"[{self.env.now:.2f}] {self.name} 收到 {sender_name} 的{status}通知,更新邻居状态!") # 这里可以加自己的状态维护逻辑,比如用字典记录每个邻居的运行状态 # 比如 self.neighbor_status[sender_name] = (status == "恢复") # 初始化模拟环境 random.seed(random_seed) env = simpy.Environment() # 创建两台机器,互相设为邻居 machine1 = Machine(env, "机器1", []) machine2 = Machine(env, "机器2", [machine1]) machine1.neighbors.append(machine2) # 互相绑定邻居关系 # 运行模拟10000个时间单位 env.run(until=10000)
关键改动说明
- 邻居绑定:每个机器初始化时只传入自己需要交互的邻居列表,完全不依赖全局系统对象,彻底解耦。
- 通知逻辑:故障/恢复时,机器只遍历自己的
neighbors列表,调用邻居的处理方法,根本不用关心系统里有多少其他设备。 - 可扩展性:后续加更多机器(比如环形、网状拓扑),只需要给新机器设置对应的邻居列表就行,机器类的核心逻辑完全不用改。
扩展小技巧
如果要搞大型拓扑(比如环形、星型),可以单独写个拓扑管理类来批量设置邻居,比如:
class Topology: def __init__(self, env, machine_count): self.machines = [Machine(env, f"机器{i}", []) for i in range(machine_count)] # 构建环形拓扑:每个机器的邻居是前一台和后一台 for i in range(machine_count): prev_idx = (i - 1) % machine_count next_idx = (i + 1) % machine_count self.machines[i].neighbors = [self.machines[prev_idx], self.machines[next_idx]]
这样机器类依然干干净净,拓扑管理的逻辑单独抽离,维护起来超方便。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

