同时简化多个过程通讯

时间:2019-07-31 11:02:30

标签: python simpy

我正在尝试使用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秒。 有什么建议解决这个问题吗?

0 个答案:

没有答案