Tornado 6.0.3 из 4.2: модуль 'tornado.web' не имеет атрибута 'асинхронный' - PullRequest
0 голосов
/ 10 июля 2019

Я перешел с торнадо 4.2 на торнадо 6.0.3, я получил ошибку

AttributeError: модуль 'tornado.web' не имеет атрибута 'асинхронный'

согласно обсуждению в торнадо v6, кажется, отбросило tornado.web.asynchronous сопрограмму. Есть ли другой способ исправить это в коде?

Я изменил @ tornado.web.asynchronous как @ tornado.gen.coroutine, это исправлено, затем я получил

RuntimeError: Невозможно записать () после окончания ()

согласно RuntimeError: Невозможно записать () после finish (). Может быть вызвано использованием асинхронных операций без @asynchronous декоратора

У меня есть 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 Ответ

1 голос
/ 10 июля 2019

Любой метод или функция, отмеченные gen.coroutine, должны вызываться с использованием оператора yield. В противном случае сопрограмма не будет работать.

Итак, вам нужно yield predict метод, когда вы его вызываете.

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