6 Stimmen

Twisted-Perspektive Broker Server-seitige Verzögerung

Ich verwende den Perspective Broker von Twisted, um zwischen dem Client und dem Server zu kommunizieren. Der Client fordert vom Server eine Remote-Methode 'remote_ssh' an. Dies veranlasst den PB-Server, eine SSH-Verbindung unter Verwendung der SSH-Bibliothek von Paramiko zu initiieren und eine Konfiguration von einem entfernten Gerät abzurufen.

Das alles funktioniert gut, aber wenn ich dies für mehrere entfernte Geräte ausführe, sehe ich das folgende Verhalten - der Perspective Broker Client sendet alle Anfragen an den PB-Server. Der PB-Server führt diese Anfragen dann eine nach der anderen aus (was in Ordnung ist), aber er gibt KEINE der Ergebnisse zurück, bis sie ALLE abgeschlossen sind.

Hier ist der relevante PB serverseitige Code:

class RMethods(pb.Root):

    def remote_ssh(self, aDict):

        self.login('SSH', aDict)        # Login to remote device
        response = self.aSSH.retrieve() # Retrieve the config
        self.aSSH.close()

        return response

if __name__ == "__main__":
    reactor.listenTCP(1885, pb.PBServerFactory(RMethods()))
    reactor.run()

Wenn ich mir verschiedene Informationen auf Systemebene (TCPDump und netstat) ansehe, sehe ich Folgendes (unter der Annahme von 5 Aufrufen der Remote-Methode):

Der Aufruf remote_ssh vom PB Client zum PB Server für die fünf entfernten Geräte erfolgt etwa zur gleichen Zeit

   self.login device 1
   self.aSSH.retrieve() device 1
   self.aSSH.close() device 1

   self.login device 2
   self.aSSH.retrieve() device 2
   self.aSSH.close() device 2

   ...

   self.login device 5
   self.aSSH.retrieve() device 5
   self.aSSH.close() device 5

   return results for all 5 devices  

Ich verstehe nicht, warum mit der Rückgabe der Ergebnisse gewartet wird (d. h. warum wird gewartet, bis Gerät5 fertig ist, bevor die Ergebnisse für Gerät1 zurückgegeben werden).

5voto

Jean-Paul Calderone Punkte 46659

Dies liegt daran, dass die Antworten erst gesendet werden können, wenn der Reaktor die Möglichkeit hat, zu laufen. Wenn alle fünf Anfragen etwa zur gleichen Zeit eintreffen, kann es sein, dass der Reaktor einmal aufwacht und alle fünf Anfragen gleichzeitig bemerkt. Er wird alle fünf an den PB-Server senden. Der remote_ssh Methode wird eine von ihnen bedienen und die ganze Zeit blockieren. Wenn sie fertig ist, wird die Antwort (fast sicher) in eine Warteschlange gestellt. Dann wird die remote_ssh Methode die nächste, und diese Antwort wird in eine Warteschlange gestellt. Und so weiter, bis alle Anfragen abgearbeitet sind. Dann hat der Reaktor die Bearbeitung der ursprünglichen Gruppe von 5 Ereignissen abgeschlossen und geht zur nächsten Aufgabe über. Wenn er weitermacht, findet er Daten, die zum Senden bereit sind, und beginnt, sie zu senden.

Mit anderen Worten: Die Blockierung verhindert den Betrieb des Reaktors, einschließlich der Verhinderung des Sendens von Ausgaben, die bereit sind, gesendet zu werden.

Sie könnten stattdessen Twisted Conch als SSH-Client ausprobieren, der Ihnen die SSH-Arbeit ohne Blockieren ermöglicht, oder Sie könnten versuchen, Ihren vorhandenen SSH-Code mit Threads (vorausgesetzt, er kann thread-sicher gemacht werden) oder mehreren Prozessen zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X