2016-05-27 1 views
0

Je semble interpréter incorrectement les règles de dataReceived et inlineCallbacks.inlineCallbacks pour un Protocol.dataReceived dans Twisted

Plus précisément, quand je fais ceci:

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

mon protocole envoie vraiment les données, mais quand je le fais:

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

Je reçois rien, la connexion se ferme juste. Ni le defer.returnValue aide ici, le comportement est juste similaire.

Veuillez expliquer.

+0

Je viens de voir votre question sur le IRC. Comme indiqué ici, pouvez-vous donner un peu plus de perspicacité dans votre code? Peut-être une application simple qui partage la ressemblance avec votre code actuel. Nous pouvons vous aider de cette façon. –

Répondre

1

Ceci est juste une intuition, mais je ne pense pas que la fonction dataReceived() devrait retourner quoi que ce soit, si un inlineCallbacks ou même le retour/ce qui donne un Deferred régulier ne sera pas vraiment « rien faire ». Désolé pour l'ambiguïté. Ce que vous devez probablement faire est de créer un Deferred et de démarrer une chaîne de rappel dans votre fonction dataReceived(). Par exemple:

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) 

Liens

+0

C'est ce que j'ai trouvé à la fin de cette discussion: décompresser les messages en file d'attente, traiter la file d'attente avec un seul message différé par heure, supprimer la file d'attente et la connexion si je trouve le message courant non désiré. – Eugene