2013-04-18 14 views
5

tworzę połączenie z serwerem tak:Jak mogę sprawdzić, czy instancja twisted.internet.protocol rozłączył

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

Teraz w jakiś inny sposób, gdzie mam uchwyt na tym obiekcie protokołu Chcę przetestować, czy protokół nadal jest podłączony, coś w stylu:

if protocol.isConnected(): 
    doSomethingElse() 

Czy jest jakikolwiek sposób to zrobić. Przyjrzałem się skręconej dokumentacji i nie mogłem znaleźć odpowiedniej metody. Ustawienie flagi w wywołaniu connectionLost() jest opcją, ale zastanawiałem się, czy mógłbym tego uniknąć.

Odpowiedz

6

Twisted stara się być jak najlżejsza, jeśli chodzi o przechowywany stan. Tak jak nagie fabryki nie mają absolutnie żadnych śladów swoich dzieci, Protocols wiedzą o sobie bardzo niewiele. Są to głównie torby na oddzwonienie.

Ustawienie flagi w metodzie connectionLost() jest sposobem na wykonanie tej flagi. Dla przyszłości:

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 

Edytuj: pamiętać, że istnieje powód, to czuje się nieswojo. Jeśli masz metodę, która musi zadać to pytanie, prawdopodobnie pracujesz poza łańcuchem zwrotnym. Jeśli kod był używany wyłącznie w ramach metod cyklu życia ujawnionych przez Protocol, może nie być potrzebny.

+0

dzięki! Nie jestem zaznajomiony z praktykami projektowymi ze skręconymi. Według metod cyklu życia, masz na myśli, że powinienem wykonywać całą moją pracę w wywołaniu połączenia connection() i nie powinienem nigdy jawnie wywoływać czegoś takiego jak protocol.doSomething()? – AnkurVj

+1

Tak. Poprzez uruchamianie wszystkich niezbędnych zachowań za pomocą metod wywołań zwrotnych, unikasz konieczności śledzenia stanu (który jest zwykle podatny na błędy), ponieważ po prostu robisz rzeczy, gdy trzeba to zrobić. Zauważ, że jest to ** pożądane **, ale nie zawsze ** możliwe **. Niektóre projekty wymagają tylko takich flag jak powyższe. Staraj się tego unikać, ale nie niszcz swojego kodu, starając się postępować zgodnie z najlepszą praktyką :) – slezica

+0

Rzeczywiście. Było mi bardzo trudno zrobić to wszystko w callbackach! Na przykład musiałem dać obiektowi protokolarnemu kilka dodatkowych zmiennych po połączeniu i zanim to zrobiło, ale nie wiedziałem, jak to zrobić! Musiałem zrobić 'protocol.val = val', a następnie jawnie wywołać' protocol.doSomething() 'zamiast robić' self.doSomething() 'w wywołaniu' connectionMade() 'callback – AnkurVj

Powiązane problemy