关于tornado.gen.Task的用法 - 异步请求

时间:2015-08-10 08:53:11

标签: asynchronous tornado

以下是我的来源:

class Get_Salt_Handler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        #yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 5)
        yield tornado.gen.Task(self.get_salt_from_db, 123)
        self.write("when i sleep 5s")

    def get_salt_from_db(self, params):
        print params

我跑了;控制台报告说:       TypeError:get_salt_from_db()得到了一个意外的关键字参数'回调' 而且我不知道为什么?

1 个答案:

答案 0 :(得分:2)

gen.Task用于使基于回调的函数适应协程样式;它不能用于调用同步函数。您可能需要的是ThreadPoolExecutor(Python 3.2+中的标准,Python 2上的pip install futures可用):

# global
executor = concurrent.futures.ThreadPoolExecutor(NUM_THREADS)

@gen.coroutine
def get(self):
    salt = yield executor.submit(self.get_salt_from_db)