4.2版本的Tornado 6.0.3:模块“ tornado.web”没有属性“异步”

时间:2019-07-10 06:23:35

标签: tornado

我已经从龙卷风4.2转移到龙卷风6.0.3,我得到了错误

AttributeError:模块'tornado.web'没有属性'asynchronous'

根据tornado v6 seems to have dropped tornado.web.asynchronous coroutine. any different way of fixing this in code?

中的讨论

我将@ tornado.web.asynchronous更改为@ tornado.gen.coroutine,这是固定的,接下来我得到了

RuntimeError:完成()之后无法写入()

按照RuntimeError: Cannot write() after finish(). May be caused by using async operations without the @asynchronous decorator

write()之后有self.finish(),没有错误,但没有任何输出

这是我的代码

class MyHandler(RequestHandler):
    _thread_pool = ThreadPoolExecutor(max_workers=10)

    @tornado.gen.coroutine
    def post(self):
        try:
            data = tornado.escape.json_decode(self.request.body)
            self.predict('mod1')
        except Exception:
            self.respond('server_error', 500)

    @concurrent.run_on_executor(executor='_thread_pool')
    def _b_run(self, mod, X):
        results = do some calculation
        return results

    @gen.coroutine
    def predict(self, mod):  
        model = mod (load from database)
        values = (load from database)
        results = yield self._b_run(model, values)
        self.respond(results)

    def respond(self, code=200):
        self.set_status(code)
        self.write(json.JSONEncoder().encode({
            "status": code
        }))
        self.finish()

尽管完成是在写完之后,但我没有得到输出

1 个答案:

答案 0 :(得分:1)

任何用gen.coroutine装饰的方法或函数都应使用yield语句来调用。否则协程将不会运行。

因此,调用时,您需要yield predict方法。

@gen.coroutine
def post(self):
    ...
    yield self.predict('mod1')
    ...