Tornado-Streaming-HTTP-Antwort, wenn AsyncHTTPClient Blöcke empfängt

Ich versuche, einen Tornado-Anforderungshandler zu schreiben, der asynchrone HTTP-Anforderungen erstellt und Daten an den Client zurückgibt, sobald er sie von asynchronen Anforderungen empfängt. Leider kann ich Tornado erst dann dazu bringen, Daten an den Client zurückzugeben, wenn alle asynchronen HTTP-Anforderungen abgeschlossen sind.

Eine Demo meines Request-Handlers finden Sie weiter unten.

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()

Ich würde erwarten, dass eine GET-Anforderung an diesen Handler zunächst den Text 'some opening' zurückgibt, dann ziemlich schnell 'some chunk' für die kleine Anforderung und später 'some chunk' (möglicherweise mehrfach) für die größere Anforderung zurückgibt Endlich wird 'some closing' zurückgegeben und die Verbindung geschlossen. Stattdessen wartet der Client nach dem Herstellen der Verbindung einige Sekunden, bis alle Anforderungen abgeschlossen sind, und empfängt dann alle HTTP-Antworten auf einmal, bevor er geschlossen wird.

Wie würde ich vorgehen, um mein gewünschtes Verhalten von Tornado zu erhalten?

Danke im Voraus!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage