如何从tornado.gen.task中调用来自不同类的函数?

时间:2015-12-25 07:45:07

标签: python tornado

我知道在调用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

1 个答案:

答案 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