我想根据参数的值执行或不执行异步查询。如果参数为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)
答案 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
关键字参数的函数。)