2016-09-24 1 views
0

Ich bin neu bei Tornado, also wollte ich wissen, ob der unten stehende Code ein korrekter Weg ist, das Problem anzugehen, oder es gibt einen besseren. Es funktioniert, aber ich bin mir nicht sicher hinsichtlich seiner Effizienz.Tornado Coroutine: Rückgabewert und einmalige Ausführung

Der Code auf der Dokumentation here

In der Mitte meines Skript basiert, muss ich HTTP-Requests laufen (10-50). Anscheinend ist es möglich, dies auf diese Weise parallel zu tun:

Wie kann ich auf Antworten zugreifen, nachdem die Coroutine fertig ist? Kann ich einfach return responses hinzufügen? Auch, da ich nur einen asynchronen Prozess einmal in meinem Code verwenden muß, beginne ich die IOLoop auf diese Weise:

# run_sync() doesn't take arguments, so we must wrap the 
# call in a lambda. 
IOLoop.current().run_sync(lambda: parallel_fetch_many(googleLinks)) 

Ist es richtig, es auf diese Weise zu tun? Oder soll ich den IOLoop einfach am Anfang des Skripts starten und am Ende stoppen, obwohl ich nur einmal einen Async-Vorgang verwende.

Grundsätzlich ist meine Frage: Ist der folgende Code korrekt?

@gen.coroutine 
def parallel_fetch_many(urls): 
    responses = yield [http_client.fetch(url) for url in urls] 
    return responses 

googleLinks = [url1,url2,...,urln] 

responses = IOLoop.current().run_sync(lambda:parallel_fetch_many(googleLinks)) 

do_something(responses) 

Antwort

1

Ja, Ihr Code sieht für mich korrekt aus.

Verwandte Themen