linux - Python: RPC opkald til SimpleXMLRPCServer hænger

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg starter serveren frisk, og jeg laver flere RPC opkald fra en klient, lykkes alle opkald. Men når klienten sender et andet sæt RPC-opkald på serveren, hænger opkaldet på klientsiden. Når jeg dræber serveren (ved hjælp af Ctrl + C), ser jeg udgangen på server side udskrivningserklæringer fra den metode, der blev kaldt af klienten før hænge.


Jeg har brugt denne kildekode i lang tid på Linux, har aldrig kørt ind i dette problem. Det er kun på Windows, som jeg kører ind i dette problem.


Server side:


class Worker(SimpleXMLRPCServer):

    finished = False

    def register\_signal(self, signum):
        """Register signal for shutting down server."""
        signal.signal(signum, self.signal\_handler)
        return 1

    def signal\_handler(self, signum, frame):
        """Signal handler for HUP/INT, shut down server on receiving."""
        logger.info("Caught signal: \%d", signum)
        self.shutdown()
        return 1

    def shutdown(self):
        """Sets finished variable to true which is monitored for shutdown."""
        self.finished = True
        return "shutting down"

    def server\_bind(self):
        """Create server."""
        self.socket.settimeout(1.0)
        self.socket.setsockopt(socket.SOL\_SOCKET, socket.SO\_REUSEADDR, 1)
        SimpleXMLRPCServer.server\_bind(self)

    def serve\_forever(self):
        while not self.finished: self.handle\_request()

server = Worker((HOST, PORT))
server.register\_function(server.shutdown)
server.register\_function(run\_cmd)
server.register\_introspection\_functions()
server.register\_instance(helper\_functions)


Kunde Side:


class WorkerProxy:
    """Store worker proxy related information."""

    def \_\_init\_\_(self, name, cluster):
        self.name = name
        self.cluster = cluster
        self.proxy = xmlrpclib.ServerProxy("http://\%s:\%d/" \% (self.name, PORT))
        self.mac = self.proxy.get\_mac() #Call helper function
        self.hostname = self.proxy.get\_hostname() #Call helper function

    def get\_mac(self):
        return self.mac

    def to\_dict(self):
        return {
            'name': self.name,
            'mac': self.mac,
            'hostname': self.hostname
        }

Bedste reference