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ę!

questionAnswers(1)

yourAnswerToTheQuestion