Ich versuche mit Pyro eine Slave-Maschine zu steuern. Ich rsync die notwendigen Python-Dateien, starten Sie einen Pyro-Server, führen Sie einige Aktionen per Fernsteuerung, und dann möchte ich den Pyro-Server zum Herunterfahren sagen.Wie kann ich einen Pyro Daemon sauber durch eine Client-Anfrage verlassen?
Ich habe Probleme, den Pryo Daemon sauber herunterzufahren. Entweder hängt es im Daemon.close()
Aufruf, oder wenn ich diese Zeile auskommentiere, ohne den Socket korrekt herunterzufahren, was zu socket.error: [Errno 98] Address already in use
führt, wenn ich den Server zu früh neu starte.
Es ist nicht der Meinung, dass SO_REUSEADDR die richtige Lösung ist, da ein unsauberes Herunterfahren des Sockels immer noch dazu führt, dass ein Socket im Zustand TIME_WAIT herumhängt und möglicherweise einige Clients Probleme verursacht. Ich denke, die bessere Lösung ist, den Pyro-Dämon zu überzeugen, seinen Sockel richtig zu schließen.
Ist es unangemessen, Daemon.shutdown() aus dem Daemon heraus aufzurufen?
Wenn ich einen Server starte und dann CTRL-C ohne angeschlossene Clients drücke, habe ich keine Probleme (keine Address already in use
Fehler). Das macht ein sauberes Herunterfahren möglich, meistens (unter der Annahme eines ansonsten vernünftigen Clients und Servers).
Beispiel: server.py
import Pyro4
class TestAPI:
def __init__(self, daemon):
self.daemon = daemon
def hello(self, msg):
print 'client said {}'.format(msg)
return 'hola'
def shutdown(self):
print 'shutting down...'
self.daemon.shutdown()
if __name__ == '__main__':
daemon = Pyro4.Daemon(port=9999)
tapi = TestAPI(daemon)
uri = daemon.register(tapi, objectId='TestAPI')
daemon.requestLoop()
print 'exited requestLoop'
daemon.close() # this hangs
print 'daemon closed'
Beispiel: client.py
import Pyro4
if __name__ == '__main__':
uri = 'PYRO:[email protected]:9999'
remote = Pyro4.Proxy(uri)
response = remote.hello('hello')
print 'server said {}'.format(response)
try:
remote.shutdown()
except Pyro4.errors.ConnectionClosedError:
pass
print 'client exiting'
Hey Eric. Ich hatte nie die 'Adresse 'bereits für den Pyro-Server benutzt, aber ich bekomme die ganze Zeit für den' Nameserver'. Wenn ich STRG + C auf dem NameServer trage, besteht eine Chance von 50%, diesen Fehler zu verursachen, wenn ich den Nameserver innerhalb von 30 Sekunden erneut ausführe. Hattest du das schon mal? –