Торнадо: могу ли я запустить код после вызова 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(), но, возможно, я ошибаюсь.
Спасибо!
Ответы
Ответ 1
Да, вы можете.
Вы должны определить метод on_finish
вашего RequestHandler
. Это функция запуска после завершения запроса и отправки ответа клиенту.
RequestHandler.on_finish()
Вызывается после окончания запроса.
Переопределите этот метод для выполнения очистки, ведения журнала и т.д. Этот метод аналог подготовки. on_finish не может производить какой-либо вывод, поскольку он вызывается после того, как ответ был отправлен клиенту.
Ответ 2
Да, ваш код после self.finish()
будет работать надежно. Но вы не можете дважды вызвать self.finish()
- это вызовет исключение. Вы можете использовать self.finish()
, чтобы закрыть соединение, прежде чем все работы на сервере будут выполнены.
Но, как сказал Коул Маклин, не делайте тяжелой работы после финиша.
Ищите другой способ выполнения тяжелых задач в фоновом режиме.