【问题标题】:inlineCallbacks for a Protocol.dataReceived in Twisted用于 Twisted 中的 Protocol.dataReceived 的 inlineCallbacks
【发布时间】:2016-05-27 09:57:48
【问题描述】:

我似乎误解了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 在这里也没有帮助,行为只是相似的。

请解释一下。

【问题讨论】:

  • 我刚刚在 IRC 上看到了您的问题。如那里所述,您能否提供对代码的更多见解?也许是一个与您的实际代码有相似之处的简单应用程序。我们可以通过这种方式为您提供更好的帮助。

标签: twisted twisted.internet


【解决方案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)

链接

【讨论】:

  • 这就是我在讨论结束时想到的:将消息解包到队列,每次使用一条延迟消息处理队列,如果我找到当前消息,则完全删除队列和连接不需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多