2016-05-27 10 views
0

dataReceivedinlineCallbacksのルールを誤って解釈しているようです。私はこれを行うときTwistedでProtocol.dataReceivedのインラインコールバック

は具体的には、:

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

を私の議定書は、実際にデータを送信しますが、私はこれを行うとき:

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

を私は何も受信しない場合、接続がちょうど終了します。 defer.returnValueもここで役立ちませんが、動作はまったく同じです。

親切に説明してください。

+0

私はIRC上であなたの質問を見ました。そこに記載されているように、あなたのコードにもう少し詳しい情報を提供できますか?おそらくあなたの実際のコードに似ているシンプルなアプリケーションです。私たちはあなたにそのように助けてくれるでしょう。 –

答えて

1

これは単なる勘ですが、私はdataReceived()機能が何かを返すことが期待されると思いますので、inlineCallbacksあるいは定期的Deferredが本当に「何もしない」だろう降伏/返却しません。あいまいさを残して申し訳ありません。おそらく、Deferredを作成し、dataReceived()関数でコールバックチェーンを開始する必要があります。たとえば:

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) 

リンク

+0

これは、私がこの議論の最後に出てきたことです。キューにメッセージを展開し、1つの遅延メッセージでキューを処理し、現在のメッセージが望ましくないと判断した場合は、キューと接続を完全に削除します。 – Eugene