扭曲中的Protocol.dataReceived的inlineCallbacks

时间:2016-05-27 09:57:48

标签: twisted twisted.internet

我似乎误解了dataReceivedinlineCallbacks的规则。

更具体地说,当我这样做时:

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也没有帮助,行为也很相似。

请解释一下。

1 个答案:

答案 0 :(得分: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)

链接