Beispiel #1
0
 def get_MWOE(self):
     msg = Message()
     msg = msg.get_MWOE()
     for edge in self.mst_edges:
         if edge == self.parent_edge
             continue
         edge.send_message(self.process_id, msg)
     recieved_mwoe_msgs = []
     while len(recieved_mwoe_edges) != len(self.mst_edges) - 1:
         for edge in self.mst_edges:
             status, msg = edge.receive_message(self.process_id)
             if not status:
                 continue
             recieved_mwoe_msgs.append(msg)
         time.sleep(0.5)
     min_edge_id = None
     min_weight = 1000000
     min_process_id = None
     for msg in recieved_mwoe_msgs:
         if msg.msg < min_weight:
             min_weight = msg.msg
             min_edge_id = msg.edge_id
             min_process_id = msg.process_id
     for edge in self.non_mst_edges:
         if edge.get_weight() < min_weight:
             min_weight = edge.get_weight()
             min_edge_id = edge_id
             min_process_id = self.process_id
     ret_msg = Message()
     ret_msg = ret_msg.send_MWOE(min_weight, min_edge_id, self.process_id)
     return ret_msg
Beispiel #2
0
 def message_listener(self):
     """Listens for the message from other process and stores the messages
     as required."""
     logging.info("listener Started.")
     sub_threads = []
     while True:
         logging.debug(self.messages)
         if not self.run_listener:
             break
         for edge in self.edges:
             status, msg = edge.receive_message(self.process_id)
             if msg is None:
                 continue
             if not status:
                 logging.warning("Unable to receive message")
                 continue
             logging.info("Message type: %s", msg.type)
             if msg.type == "test":
                 ret_msg = Message()
                 edge.send_message(
                     ret_msg.ret_test_message(self.component_id),
                     self.process_id)
                 logging.debug("Test message returned to process: %s",
                               str(self.get_edge_processid(edge)))
                 continue
             elif msg.type == "update_component":
                 sub_t = Thread(name=self.process_id + ".l.upd_comp",
                                target=self.process_update_component_msg,
                                args=(
                                    msg,
                                    edge,
                                ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "get_MWOE":
                 sub_t = Thread(name=self.process_id + ".l.mwoe",
                                target=self.handle_get_MWOE,
                                args=(edge, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
             elif msg.type == "merge_MWOE":
                 self.merge_mwoe_received_lock.acquire()
                 self.merge_mwoe_received = msg
                 self.merge_mwoe_received_lock.release()
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_mwoe,
                                args=(msg, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "merge":
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_request,
                                args=(
                                    msg,
                                    edge,
                                ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 # this msg should also be in messages dict, hence no
                 # continue statement here.
             elif msg.type == "merge_to_leader":
                 sub_t = Thread(name=self.process_id + ".l.merge_leader",
                                target=self.work_on_merge_to_leader_msg,
                                args=(msg, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "deny_merge_upward":
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             elif msg.type == "completed":
                 self.completed = True
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             self.messages_lock.acquire()
             if msg.type in self.messages[edge.id]:
                 self.messages[edge.id][msg.type].append(msg)
             else:
                 self.messages[edge.id][msg.type] = [msg]
             self.messages_lock.release()
         time.sleep(1)
     for t in sub_threads:
         t.join()
Beispiel #3
0
 def message_listener(self):
     """Listens for the message from other process and stores the messages
     as required."""
     logging.info("listener Started.")
     sub_threads = []
     while True:
         logging.debug(self.messages)
         if not self.run_listener:
             break
         for edge in self.edges:
             status, msg = edge.receive_message(self.process_id)
             if msg is None:
                 continue
             if not status:
                 logging.warning("Unable to receive message")
                 continue
             logging.info("Message type: %s", msg.type)
             if msg.type == "test":
                 ret_msg = Message()
                 edge.send_message(ret_msg.ret_test_message(self.component_id),
                                   self.process_id)
                 logging.debug("Test message returned to process: %s",
                              str(self.get_edge_processid(edge)))
                 continue
             elif msg.type == "update_component":
                 sub_t = Thread(name=self.process_id + ".l.upd_comp",
                                   target=self.process_update_component_msg,
                                   args=(msg, edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "get_MWOE":
                 sub_t = Thread(name=self.process_id + ".l.mwoe",
                                target=self.handle_get_MWOE,
                                args=(edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
             elif msg.type == "merge_MWOE":
                 self.merge_mwoe_received_lock.acquire()
                 self.merge_mwoe_received = msg
                 self.merge_mwoe_received_lock.release()
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_mwoe,
                                args=(msg,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "merge":
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_request,
                                args=(msg, edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 # this msg should also be in messages dict, hence no
                 # continue statement here.
             elif msg.type == "merge_to_leader":
                 sub_t = Thread(name=self.process_id + ".l.merge_leader",
                                target=self.work_on_merge_to_leader_msg,
                                args=(msg,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "deny_merge_upward":
                 self.round_completed = True
                 for ed in [ e for e in self.mst_edges if e != edge ]:
                     ed.send_message(msg, self.process_id)
                 continue
             elif msg.type == "completed":
                 self.completed = True
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             self.messages_lock.acquire()
             if msg.type in self.messages[edge.id]:
                 self.messages[edge.id][msg.type].append(msg)
             else:
                 self.messages[edge.id][msg.type] = [msg]
             self.messages_lock.release()
         time.sleep(1)
     for t in sub_threads:
         t.join()