Используя Tornado, у меня есть запрос Get, который занимает много времени, так как он делает много запросов к другому веб-сервису и обрабатывает данные, может потребоваться несколько минут для полного завершения. Я не хочу, чтобы это блокировало весь веб-сервер от ответа на другие запросы, которые он в настоящее время делает.
Как я понимаю, Tornado является однопоточным и выполняет каждый запрос синхронно, даже если он обрабатывает их асинхронно (все еще запутанный на этом бите). Есть части длинного процесса, который может быть точкой паузы, чтобы сервер мог обрабатывать другие запросы (возможное решение?). Я запускаю его на Heroku с одним рабочим, поэтому не уверен, как это переводится в размножение нового потока или многопроцессорности, с которыми у меня нет опыта работы с python.
Вот что я пытаюсь сделать: клиент делает вызов get для запуска процесса, затем я прохожу через другой вызов каждые 5 секунд, чтобы проверить статус и обновить страницу с помощью новой информации (длинный опрос также будет работают, но сталкиваются с тем же вопросом). Проблема заключается в том, что запуск длинного процесса блокирует все новые запросы на получение (или новые длинные сеансы опроса) до тех пор, пока он не завершится.
Есть ли простой способ начать этот длинный вызов и не блокировать его весь веб-сервер? Есть ли что-нибудь, что я могу добавить в код, чтобы сказать.. "пауза, перейдите в ожидающие запросы, затем продолжите"?
Мне нужно инициировать запрос получения на ProcessHandler. Затем мне нужно продолжить запрос StatusHandler во время работы ProcessHandler.
Пример:
class StatusHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("status.html")
class ProcessHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.updateStatus("0")
result1 = self.function1()
self.updateStatus("1")
result2 = self.function2(result1)
self.updateStatus("2")
result3 = self.function3(result2)
self.updateStatus("3")
self.finish()