Если у вас есть Торнадо RequestHandler
, помеченный декоратором @gen.coroutine
, вы можете использовать Future
s и ключевое слово yield
, чтобы выполнить то, что вы хотите.
Для простого случая возврата результата асинхронной выборки HTTP достаточно метода AsyncHTTPClient.fetch
:
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
def handle_response(response):
if response.error:
print("Error: %s" % response.error)
else:
self.write(response.body)
http_client = AsyncHTTPClient()
yield http_client.fetch('http://www.google.com/', handle_response)
Чтобы создать функцию, которая асинхронно возвращает произвольный результат, вам нужно создать собственный объект Future
для возврата вызывающей стороне. Допустим, ваша функция должна выполнить асинхронную веб-выборку перед возвратом пользовательского значения:
def get_async_result():
future = Future()
def handle_response(response):
if response.error:
future.set_exception(Exception("Yikes"))
else:
future.set_result("I, for one, welcome our new robot overlords.")
http_client = AsyncHTTPClient()
http_client.fetch('http://www.google.com/', handle_response)
return future
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
result = yield get_async_result()
print result # "I, for one, welcome our new robot overlords."
# rest of handler here...
Оператор yield
в вашем RequestHandler логически блокируется до тех пор, пока не будет завершен возвращенный Future
, предоставляя вам результат (или исключение) напрямую.
(Обратите внимание, что как описано здесь , вы не можете использовать асинхронные механизмы Tornado в Google App Engine.)