不能在龙卷风的期货上调用 result()
Can't call result() on futures in tornado
我想使用 python 库 tornado(4.2 版)做一些异步 HTTP 请求。但是我不能强迫未来完成(使用 result()
),因为我得到一个异常:"DummyFuture does not support blocking for results".
我有 python 3.4.3,因此未来的支持应该是标准库的一部分。 concurrent.py
的文档说:
Tornado will use concurrent.futures.Future
if it is available;
otherwise it will use a compatible class defined in this module.
下面提供了我正在尝试做的最小示例:
from tornado.httpclient import AsyncHTTPClient;
future = AsyncHTTPClient().fetch("http://google.com")
future.result()
如果我正确理解我的问题,它的发生是因为未使用 concurrent.futures.Future
的导入。 tornado 中的相关代码似乎在 concurrent.py
中,但我在理解问题的确切位置方面并没有真正取得进展。
尝试创建另一个 Future
并使用 add_done_callback
:
from tornado.concurrent import Future
def async_fetch_future(url):
http_client = AsyncHTTPClient()
my_future = Future()
fetch_future = http_client.fetch(url)
fetch_future.add_done_callback(
lambda f: my_future.set_result(f.result()))
return my_future
但是你还需要用ioloop解决未来问题,像这样:
# -*- coding: utf-8 -*-
from tornado.concurrent import Future
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
def async_fetch_future():
http_client = AsyncHTTPClient()
my_future = Future()
fetch_future = http_client.fetch('http://www.google.com')
fetch_future.add_done_callback(
lambda f: my_future.set_result(f.result()))
return my_future
response = IOLoop.current().run_sync(async_fetch_future)
print(response.body)
另一种方法是使用 tornado.gen.coroutine
装饰器,如下所示:
# -*- coding: utf-8 -*-
from tornado.gen import coroutine
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
@coroutine
def async_fetch_future():
http_client = AsyncHTTPClient()
fetch_result = yield http_client.fetch('http://www.google.com')
return fetch_result
result = IOLoop.current().run_sync(async_fetch_future)
print(result.body)
coroutine
装饰器使函数 return 成为 Future
。
我想使用 python 库 tornado(4.2 版)做一些异步 HTTP 请求。但是我不能强迫未来完成(使用 result()
),因为我得到一个异常:"DummyFuture does not support blocking for results".
我有 python 3.4.3,因此未来的支持应该是标准库的一部分。 concurrent.py
的文档说:
Tornado will use
concurrent.futures.Future
if it is available; otherwise it will use a compatible class defined in this module.
下面提供了我正在尝试做的最小示例:
from tornado.httpclient import AsyncHTTPClient;
future = AsyncHTTPClient().fetch("http://google.com")
future.result()
如果我正确理解我的问题,它的发生是因为未使用 concurrent.futures.Future
的导入。 tornado 中的相关代码似乎在 concurrent.py
中,但我在理解问题的确切位置方面并没有真正取得进展。
尝试创建另一个 Future
并使用 add_done_callback
:
from tornado.concurrent import Future
def async_fetch_future(url):
http_client = AsyncHTTPClient()
my_future = Future()
fetch_future = http_client.fetch(url)
fetch_future.add_done_callback(
lambda f: my_future.set_result(f.result()))
return my_future
但是你还需要用ioloop解决未来问题,像这样:
# -*- coding: utf-8 -*-
from tornado.concurrent import Future
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
def async_fetch_future():
http_client = AsyncHTTPClient()
my_future = Future()
fetch_future = http_client.fetch('http://www.google.com')
fetch_future.add_done_callback(
lambda f: my_future.set_result(f.result()))
return my_future
response = IOLoop.current().run_sync(async_fetch_future)
print(response.body)
另一种方法是使用 tornado.gen.coroutine
装饰器,如下所示:
# -*- coding: utf-8 -*-
from tornado.gen import coroutine
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
@coroutine
def async_fetch_future():
http_client = AsyncHTTPClient()
fetch_result = yield http_client.fetch('http://www.google.com')
return fetch_result
result = IOLoop.current().run_sync(async_fetch_future)
print(result.body)
coroutine
装饰器使函数 return 成为 Future
。