Подтвердить что ты не робот

Торнадо: могу ли я запустить код после вызова self.finish() в асинхронном RequestHandler?

Я использую Торнадо. У меня есть куча асинхронных обработчиков запросов. Большинство из них выполняют свою работу асинхронно, а затем сообщают результат этой работы пользователю. Но у меня есть один обработчик, задачей которого является просто сказать пользователю, что их запрос будет обработан в какой-то момент в будущем. Я завершаю HTTP-соединение, а затем выполняю больше работы. Здесь тривиализованный пример:

class AsyncHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, *args, **kwargs):
        # first just tell the user to go away
        self.write("Your request is being processed.")
        self.finish()

        # now do work
        ...

Мой вопрос: это законное использование Tornado? Будет ли код после self.finish() работать надежно? У меня никогда не было проблем с этим раньше, но теперь я вижу проблему с ним в одной из моих сред разработки (не все). Здесь есть несколько рабочих обходов, которые я уже определил, но я хочу удостовериться, что я не пропущу что-то фундаментальное для жизненного цикла запроса в Tornado. Не существует SEEM, поэтому я не смог бы запустить код после вызова self.finish(), но, возможно, я ошибаюсь.

Спасибо!

4b9b3361

Ответ 1

Да, вы можете.

Вы должны определить метод on_finish вашего RequestHandler. Это функция запуска после завершения запроса и отправки ответа клиенту.

RequestHandler.on_finish()

Вызывается после окончания запроса.

Переопределите этот метод для выполнения очистки, ведения журнала и т.д. Этот метод аналог подготовки. on_finish не может производить какой-либо вывод, поскольку он вызывается после того, как ответ был отправлен клиенту.

Ответ 2

Да, ваш код после self.finish() будет работать надежно. Но вы не можете дважды вызвать self.finish() - это вызовет исключение. Вы можете использовать self.finish(), чтобы закрыть соединение, прежде чем все работы на сервере будут выполнены.

Но, как сказал Коул Маклин, не делайте тяжелой работы после финиша. Ищите другой способ выполнения тяжелых задач в фоновом режиме.