2016-05-27 9 views
0

Ich scheinen die Regeln von dataReceived und inlineCallbacks falsch zu interpretieren.inlineCallbacks für eine Protocol.dataReceived in Twisted

Genauer gesagt, wenn ich dies tun:

def dataReceived(self, data): 
    self.transport.write('ok') 

mein Protokoll sendet die Daten wirklich, aber wenn ich dies tun:

@defer.inlineCallbacks 
def dataReceived(self, data): 
    a = yield True # this stands for some adbapi call actually 
    self.transport.write('ok') 

ich nichts empfangen, dann Verbindung schließt gerade. Auch der defer.returnValue hilft hier nicht, Verhalten ist nur ähnlich.

Bitte erklären. Diese

+0

Ich sah nur Ihre Frage im IRC. Wie können Sie hier etwas mehr Einblick in Ihren Code geben? Vielleicht eine einfache Anwendung, die Ähnlichkeit mit Ihrem tatsächlichen Code hat. Wir können Ihnen auf diese Weise bessere Hilfe geben. –

Antwort

1

ist nur eine Ahnung, aber ich glaube nicht, die dataReceived() Funktion etwas zurück zu erwarten ist, so ein inlineCallbacks oder sogar Rückkehr/a regelmäßiges Deferred „alles tun,“ was nicht wirklich. Entschuldigung für die Mehrdeutigkeit. Was Sie wahrscheinlich tun sollten, ist ein Deferred erstellen und starten Sie eine Rückruf-Kette in Ihrer dataReceived() Funktion. Zum Beispiel:

def dataReceived(self, data): 
    # ... 
    deferredObj = adbapi.runQuery('SELECT * FROM ...') # this returns a Deferred 
    deferredObj.addCallback(self.someCallback)   # exec self.someCallback() after query returns 
    deferredObj.addErrback(self.anotherCallback, *args, **kwargs) 

def someCallback(self, result): 
    """ 
    When the db query returns, do something useful here 
    """ 
    print(result) 

Verbindungen

+0

Das ist, was ich am Ende dieser Diskussion herausgefunden habe: Entpacke Nachrichten in die Warteschlange, verarbeite die Warteschlange mit einer einzelnen aufgeschobenen Nachricht pro Zeit, lasse die Warteschlange und Verbindung ganz fallen, wenn ich die aktuelle Nachricht als unerwünscht empfinde. – Eugene