Я пытаюсь написать обработчик запросов Tornado, который делает асинхронные HTTP-запросы, и возвращает данные клиенту, когда он получает его от асинхронных запросов. К сожалению, я не могу заставить Tornado возвращать любые данные клиенту до тех пор, пока не завершится все его HTTP-запросы Async.
Ниже приведено описание моего обработчика запросов.
class StreamingHandler(web.RequestHandler):
all_requested = False
requests = []
@web.asynchronous
def get(self):
http_client = httpclient.AsyncHTTPClient()
self.write('some opening')
big_request = httpclient.HTTPRequest(url='[some_big_request]', streaming_callback=self.on_chunk)
small_request = httpclient.HTTPRequest(url='[some_small_request]', streaming_callback=self.on_chunk)
self.requests.append(http_client.fetch(big_request, callback=self.on_response_complete))
self.requests.append(http_client.fetch(small_request, callback=self.on_response_complete))
self.all_requested = True
def on_chunk(self, chunk):
self.write('some chunk')
self.flush()
def on_response_complete(self, response):
if self.all_requested and all(request.done() for request in self.requests):
self.write('some closing')
self.finish()
Я бы ожидал запроса GET этому обработчику, чтобы изначально вернуть текст "некоторое открытие", а затем довольно быстро вернуть "некоторый кусок" для небольшого запроса и позже вернуть "некоторый кусок" (потенциально несколько раз) для большего запрос, прежде чем, наконец, вернуть "некоторое закрытие" и закрыть соединение. Вместо этого, после подключения, клиент ждет несколько секунд для завершения всех запросов, а затем получает все HTTPResponse сразу, перед закрытием.
Как я могу получить желаемое поведение от Tornado?
Спасибо заранее!