Я пытаюсь написать обработчик запросов 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?
Спасибо заранее!