我正在尝试使用Simpy库模拟p2p网络。不要怪我没有使用真实的通讯协议。我太虚弱了。无论如何,网络中的仿真节点会根据其他节点的行为而进步,并受到固定时间的限制。
整个系统类似于拜占庭一般问题。具体来说,如果有3个节点,A,B和C以网络中的第1阶段开始,则每个人如果决定进入第2阶段,都会向其他人发送消息。如果节点A获得2票,表示“移至第2阶段” ,则节点A将进入阶段2。但是,如果节点A在5秒钟内未收到任何信息,则节点A仍将以默认值进入阶段2。如果节点在3秒内收到足够的消息以将其推入阶段2,它将跳入阶段2。同样,它适用于所有其他节点。 我已经用生成器和使用者实现了一个节点对象,它遵循过程通信教程中的指南。我将在下面显示抽象代码:
class Pipe(object):
def __init__(self, env, delay, bdelay, capacity=simpy.core.Infinity):
self.bdelay = bdelay
self.env = env
self.capacity = capacity
self.delay = delay
self.pipe = simpy.Store(self.env, self.capacity)
class Node(object):
def __init__(self, env, id):
self.env = env
self.msg =[]
def Gossip_Msg(self, msg):
if not self.Pipes:
raise RuntimeError('There are no peer connected')
events = [pipe.pipe.put(msg) for pipe in self.Pipes]
return self.env.all_of(events)
def Generarotr(self):
while True:
message = 'agree'
self.Gossip_msg(message)
max_wait = 5
timer=0
#stage1
while timer <5:
if enough_agreement:
break
else:
timer+=1
yield self.env.timeout(1)
#stage2
message = 'agree' ##mesage could be disagree
timer=0
while timer <5:
if enough_agreement:
break
else:
timer+=1
yield self.env.timeout(1)
def consumer(self,inpipe):
while True:
msg = yield inpipe.pipe.get()
# store msg
self.msg.append(msg)
env=simpy.env()
node1=node(env)
node2=node(env)
node3=node(env)
env.process(node1.generator())
env.process(node2.consumer(pipe))
env.process(node3.consumer(pipe))
env.process(node2.generator())
env.process(node1.consumer(pipe))
env.process(node3.consumer(pipe))
env.process(node3.generator())
env.process(node1.consumer(pipe))
env.process(node2.consumer(pipe))
env.run(until=None)
由于我需要一些rand延迟到味精的时间,因此我给了管道对象一些时间。可以在“ env.now”大于时间值之后读取消息。 上面的代码在第一轮工作正常。但是第二轮失败了。 失败的情况是某些节点可能会错过原本打算在5秒超时结束之前接收的值。消息交易由另一个功能(此处未显示)处理。 但是它总共超时了5秒。 有什么建议解决这个问题吗?