gpt4 book ai didi

python - 不能在 Tornado 的 future 上调用 result()

转载 作者:太空狗 更新时间:2023-10-29 21:52:35 26 4
gpt4 key购买 nike

我想使用 python 库 tornado(版本 4.2)执行一些异步 HTTP 请求。但是,我不能强制 future 完成(使用 result()),因为我得到一个异常:“DummyFuture 不支持结果阻塞”。

我有 python 3.4.3,因此 future 的支持应该是标准库的一部分。 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 documentation

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解决 future 问题,就像这样:

# -*- 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 装饰器使函数返回一个 Future

关于python - 不能在 Tornado 的 future 上调用 result(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com