2013-04-18 6 views
5

abgeklemmt ich meine Verbindung zu einem Server wie folgt zu erstellen:Wie kann ich überprüfen, ob eine twisted.internet.protocol Instanz

connection = TCP4ClientEndPoint(reactor, server_host, server_port) 
factory = Factory() 
factory.protocol = Protocol 
protocol = yield connection.connect(factory) 
protocol.doSomething()  # returns a deferred 

nun in einem anderen Verfahren, wo ich einen Griff auf diesem Protokoll bezweckt Ich möchte testen, ob das Protokoll noch angeschlossen ist, etwa wie folgt:

if protocol.isConnected(): 
    doSomethingElse() 

Gibt es eine Möglichkeit, dies zu tun. Ich schaute auf die verdrehte Dokumentation und konnte keine relevante Methode finden. Das Setzen eines Flags im connectionLost() Callback ist eine Option, aber ich habe mich gefragt, ob ich das vermeiden könnte.

Antwort

6

Twisted versucht im gespeicherten Zustand so leicht wie möglich zu sein. So wie nackte Fabriken absolut keine Spur von ihren Kindern haben, wissen Protocols sehr wenig über sich selbst. Sie sind meist Rückruftaschen.

Das Setzen einer Flagge in der connectionLost() Methode ist der Weg, es zu tun. Für zukünftige Referenz:

from twisted.internet.protocol import Protocol 

class StatefulProtocol(Protocol): 
    def __init__(self, factory): 
     self.connected = False 

    def connectionMade(self): 
     self.connected = True 

    def connectionLost(self, reason): 
     self.connected = False 

bearbeiten: beachten Sie, dass es einen Grund gibt das fühlt sich unwohl. Wenn Sie eine Methode haben, die diese Frage stellen muss, arbeiten Sie wahrscheinlich außerhalb der Callback-Kette. Wenn Sie Code ausschließlich innerhalb der Lebenszyklusmethoden ausführen, die von Protocol verfügbar gemacht werden, benötigen Sie das möglicherweise nicht.

+0

danke! Ich bin nicht sehr vertraut mit den Design-Praktiken mit twisted. Mit Life Cycle-Methoden meinst du, dass ich meine ganze Arbeit im connectionMade() - Callback ausführen sollte und nicht unbedingt etwas wie protocol.doSomething() nennen sollte? – AnkurVj

+1

Ja. Indem Sie das gesamte erforderliche Verhalten von den Callback-Methoden aus ausführen, vermeiden Sie die Notwendigkeit, den Status zu verfolgen (der normalerweise fehleranfällig ist), weil Sie nur dann etwas tun, wenn es erledigt werden muss. Beachten Sie, dass dies ** wünschenswert **, aber nicht immer ** möglich ** ist. Einige Designs benötigen nur Flaggen wie oben. Versuchen Sie es zu vermeiden, aber zerstören Sie nicht Ihre Codebasis in einem Versuch, Best Practice zu folgen :) – slezica

+0

In der Tat. Ich fand es sehr schwierig, all das in den Rückrufen zu tun! Zum Beispiel musste ich dem Protokollobjekt einige zusätzliche Variablen geben, nachdem ich verbunden war und bevor es irgendwas getan hat, aber ich wusste nicht, wie ich das machen sollte! Ich musste 'protocol.val = val' machen und dann explizit' protocol.doSomething() 'aufrufen, anstatt' self.doSomething() 'in' connectionMade() 'callback zu tun. – AnkurVj