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
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()
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()