我知道在调用tornado.gen.task时该函数应该包含一个回调参数,但是在从另一个类调用函数时该怎么做?
class RequestHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self, path):
response = yield tornado.gen.Task(Query('hello').do_things())
self.write('<h1>' + response + '</h1>')
self.finish()
class Query:
def __init__(self, query):
self.query = query
#defined some parameters
def parsing(self):
#do some processing
def do_things(self):
#do things by using all defined parameters and parsing function
return #something
答案 0 :(得分:1)
您应该为Task
提供一个功能(如果需要,还可以提供参数)。所以正确的电话应该是
class RequestHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self, path):
response = yield tornado.gen.Task(Query('hello').do_things)
self.write('<h1>' + response + '</h1>')
self.finish()
但do_things
不是协程式也不是回调式异步函数 - 它的调用就像response = Query('hello').do_things()
一样。
来自Task docs:
调整基于回调的异步函数以在协同程序中使用。
获取一个函数(和可选的附加参数)并运行它 这些参数加上一个回调关键字参数。争论过去了 返回作为yield表达式的结果返回。
所以你的do_things
缺少回调参数,必须调用它来提供结果
class Query:
def do_things(self, callback):
#do things by using all defined parameters and parsing function
return callback(some_res)
没有(显式)回调的版本,因此不需要Task包装器:
class RequestHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self, path):
response = yield Query('hello').do_things()
self.write('<h1>' + response + '</h1>')
self.finish()
class Query:
@gen.coroutine
def do_things(self):
#do things by using all defined parameters and parsing function
return some_res