You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:33