Twisted和nested在crossbar.io中使用内联回调延迟

时间:2016-01-26 12:13:51

标签: python asynchronous twisted crossbar

我对Twisted和crossbar.io相对较新,我目前正在使用sqlalchemy和alchimia(一个使用sqlalchemy with twisted的层)进行一些数据库抽象。到目前为止我构建的db抽象正在按预期工作,但在我的crossbar过程中进行异步db调用时遇到问题。我想这是因为我有嵌套的异步调用,外部调用是一些crossbar远程过程,而内部是数据库访问。

我想做的是以下内容:

@inlineCallbacks
def onJoin(self, details):
  ...
  def login(user, password): # <-- outer call
    ...
    db_result = yield db.some_query(user, password) # <-- inner call
    for row in db_result: # <-- need to wait for db_result
      return 'authentication_ticket'
    return 'error'

为了能够对用户进行身份验证,我必须等待数据库中的数据,然后发出有效的票证或返回错误。目前我收到一个错误,我无法迭代延迟,因为我不等待db查询完成。

现在,我如何在我的登录RPC内等待内部数据库调用,然后验证用户然后返回。我知道可以将扭曲的异步调用链接起来,但我不知道在这个特殊情况下如何使用crossbar以及当我的外部函数使用@inlineCallbacks快捷方式时这样做。

更新

修补我现在可以添加回调数据库查询。不幸的是现在我不知道如何将内部函数的返回值传递给外部函数(外部函数需要返回用户通过身份验证的票证):

@inlineCallbacks
  def onJoin(self, details):
  ...
  def login(user, password): # <-- outer call
    db_result = db.some_query(user, password) # <-- inner call

    def my_callback(query_result):
      if not query_result.is_empty():
        return 'user_ticket' # <-- needs to be returned by outer method

    db_result.addCallback(my_callback)

    return my_callback_result # <-- need something like that

我在回调函数中尝试了defer.returnValue('user_ticket'),但这给了我一个错误。

1 个答案:

答案 0 :(得分:2)

您的问题似乎是,虽然login预计会产生Deferred,但它并未使用@inlineCallbacks进行修饰。