Как отличить пиров с помощью socket_monitor - PullRequest
0 голосов
/ 29 мая 2019

Я создаю распределенную систему с одним сервером и множеством пиров.Для связи я использую ZeroMQ, шаблон REQ-REP.Для того, чтобы иметь возможность обнаружить, что соединение было потеряно, я использую socket_monitor.Проблема в том, что, когда я получаю сообщение об отключении, я не знаю, как определить, какой узел был отключен.Единственная информация, которая позволяет различать соединения, - это файловый дескриптор, который я получаю от socket_monitor, но я не знаю, к какому соединению / пиру он принадлежит.

Код клиента:

class ZMQ_RPC():                                                               
    def __init__(self):                                                        
        context = zmq.Context()                                                
        self.socket = context.socket(zmq.REQ)                                  
        self.socket.connect("tcp://128.141.79.50:8003")                        

    def send_RPC(self, function_name, *args):                                  
        msg = [function_name, *args]                                           
        msg = pickle.dumps(msg)                                                
        self.socket.send(msg)                                                     
        message = self.socket.recv()                                           
        print(message)

Код сервера:

EVENT_MAP = {}                                                                  
print("Event names:")                                                           
for name in dir(zmq):                                                          
    if name.startswith('EVENT_'):                                               
        value = getattr(zmq, name)                                             
        print("%21s : %4i" % (name, value))                                     
        EVENT_MAP[value] = name                                                 

context = zmq.Context()                                                         
socket = context.socket(zmq.REP)                                                
monitor = socket.get_monitor_socket()                                           
socket.bind("tcp://128.141.79.50:8003")                                        

poller = zmq.Poller()                                                           
poller.register(monitor, zmq.POLLIN | zmq.POLLERR)                              
poller.register(socket, zmq.POLLIN | zmq.POLLERR)                               

while True:                                                                     
    socks = dict(poller.poll())                                                
    if socket in socks:                                                         
        message = socket.recv()                                                
        message = pickle.loads(message)                                         
        try:                                                                   
            func = getattr(self, message[0])                                      
            func(*message[1:])                                                 
            socket.send(b"Success")                                               
        except AttributeError:                                                    
            socket.send(b"Error")                                                 
    if monitor in socks:                                                          
        evt = recv_monitor_message(monitor)                                       
        evt.update({'description': EVENT_MAP[evt['event']]})                      
            print("Event: {}".format(evt)) 
...