2013-04-18 19 views
5

Creo il mio collegamento ad un server in questo modo:Come posso verificare se un'istanza twisted.internet.protocol è disconnesso

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

Ora, in qualche altro metodo, dove ho una maniglia su questo oggetto protocollo Voglio verificare se il protocollo è ancora connesso, qualcosa del tipo:

if protocol.isConnected(): 
    doSomethingElse() 

C'è un modo per farlo. Ho esaminato la documentazione contorta e non ho potuto trovare un metodo pertinente. L'impostazione di un flag nel callback connectionLost() è un'opzione, ma mi chiedevo se avrei potuto evitare di farlo.

risposta

6

Twisted cerca di essere il più leggero possibile quando si tratta di uno stato memorizzato. Proprio come le fabbriche nude non tengono assolutamente traccia dei loro figli, lo Protocols sa molto poco di se stessi. Sono principalmente borse di richiamata.

L'impostazione di un flag nel metodo connectionLost() è il modo per farlo. Per riferimento futuro:

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 

Edit: notare che c'è un motivo per questo si sente a disagio. Se hai un metodo che deve fare questa domanda, probabilmente stai lavorando fuori dalla catena di callback. Se stavi eseguendo il codice esclusivamente all'interno dei metodi del ciclo di vita esposti dallo Protocol, potresti non averne bisogno.

+0

grazie! Non ho molta familiarità con le pratiche di progettazione con twistato. Con i metodi del ciclo di vita, vuoi dire che dovrei fare tutto il mio lavoro nel callback connectionMade(), e non dovrei mai chiamare esplicitamente qualcosa come protocol.doSomething()? – AnkurVj

+1

Sì. Eseguendo tutto il comportamento necessario dai metodi di callback, si evita la necessità di tenere traccia dello stato (che di solito è soggetto ad errori) perché basta fare cose quando è necessario. Si noti che questo è ** desiderabile **, ma non sempre ** possibile **. Alcuni progetti hanno solo bisogno di bandiere come sopra. Cerca di evitarlo, ma non distruggere il tuo codebase nel tentativo di seguire le migliori pratiche :) – slezica

+0

Infatti. Stavo trovando molto difficile fare tutto ciò nelle callback! Per esempio dovevo dare all'oggetto protocollo alcune variabili aggiuntive dopo averlo collegato e prima che facesse qualcosa, ma non sapevo come farlo! Ho dovuto fare 'protocol.val = val' e quindi chiamare esplicitamente' protocol.doSomething() 'invece di fare' self.doSomething() 'in' connectionMade() 'callback – AnkurVj

Problemi correlati