Z tego co rozumiem z dokumentacji modułu tornado.gen wynika, że tornado.gen.Task składa się z tornado.gen.Callback i tornado.gen.Wait z każdą parą Callback/Wait skojarzoną z unikalnymi kluczami. ..Tornado Async Wyniki zwracania HTTP przyrostowo
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
response = yield [tornado.gen.Wait("google"), tornado.gen.Wait("tornado"), tornado.gen.Wait("python")]
do_something_with_response(response)
self.render("template.html")
Tak więc powyższy kod otrzyma wszystkie odpowiedzi z różnych adresów URL. Teraz to, co muszę zrobić, to zwrócić odpowiedź, gdy tylko jeden z klientów http_ zwraca dane. Jeśli więc "tornadoweb.org" najpierw zwróci dane, powinno to zrobić self.write (respose), a pętla w def get() powinna pozostać w oczekiwaniu na zakończenie innych klientów HTTP_. Wszelkie pomysły na pisanie tego przy użyciu interfejsu tornado.gen.
bardzo niejasne realizacja (i składniowo niepoprawne), co staram się zrobić jak byłoby to
class GenAsyncHandler2(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
while True:
response = self.get_response()
if response:
self.write(response)
self.flush()
else:
break
self.finish()
def get_response(self):
for key in tornado.gen.availableKeys():
if key.is_ready:
value = tornado.gen.pop(key)
return value
return None