Tornado streaming HTTP jako AsyncHTTPClient otrzymuje porcje
Próbuję napisać program obsługi żądań Tornado, który wykonuje asynchroniczne żądania HTTP i zwraca dane do klienta, ponieważ odbiera je z żądań asynchronicznych. Niestety, nie mogę zmusić Tornado do zwrócenia jakichkolwiek danych do klienta, dopóki wszystkie jego żądania Async HTTPRequest nie zostaną zakończone.
Demo mojego programu obsługi wniosków znajduje się poniżej.
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()
Spodziewałbym się, że żądanie GET skierowane do tego programu obsługi początkowo zwróci tekst „pewne otwarcie”, a następnie dość szybko zwróci „trochę porcji” dla małego żądania, a później zwróci „trochę porcji” (potencjalnie wiele razy) dla większego żądania, przed w końcu wraca „trochę zamknięcia” i zamyka połączenie. Zamiast tego po nawiązaniu połączenia klient czeka kilka sekund na zakończenie wszystkich żądań, a następnie odbiera cały HTTPResponse natychmiast, przed zamknięciem.
Jak mógłbym uzyskać pożądane zachowanie od Tornado?
Z góry dziękuję!