从@ tornado.gen.engine函数返回没有收益?

时间:2014-11-19 15:41:43

标签: python tornado

我想根据参数的值执行或不执行异步查询。如果参数为True,则不应执行查询。

我有这样的方法:

@tornado.gen.engine
def retrieveSomeData(self, feelingLucky, callback):
    if feelingLucky:
        return      # <-- doesn't work, function never returns!
    else:
        response = yield tornado.gen.Task(queryFunction, param1....)
        callback(response)

如何让feelingLucky分支工作?

我能想到的唯一一件事是提出异常并在调用者中捕获它。但那非常难看。或者,如果存在 null 任务...

这样的事情

(Python 2.7,Tornado 3.2)

2 个答案:

答案 0 :(得分:5)

最好使用现代gen.coroutine而不是过时的gen.engine。这使得这种条件逻辑简单而自然:

@tornado.gen.coroutine
def retrieveSomeData(self, feelingLucky):
    if feelingLucky:
        return
    else:
        response = yield Tornado.gen.Task(queryFunction, param1....)
        raise gen.Return(response)

如果你也将queryFunction转换为coroutine样式,你得到:

@tornado.gen.coroutine
def retrieveSomeData(self, feelingLucky):
    if feelingLucky:
        return
    else:
        response = yield queryFunction(param1....)
        raise gen.Return(response)

答案 1 :(得分:1)

这似乎有效:

def _nullTask(self, callback):
    callback()

@tornado.gen.engine
def retrieveSomeData(self, feelingLucky, callback):
    if feelingLucky:
        yield tornado.gen.Task(self._nullTask)
        callback(None)
    else:
        response = yield tornado.gen.Task(queryFunction, param1....)
        callback(response)

也许有更好的方法?...

(基于gen.py中的此评论:

  

对于不返回Futures的函数,Task适用于任何函数   采用callback关键字参数的函数。)