无法在龙卷风上调用result()

发布于 2021-01-29 14:57:12

我想使用python库龙卷风(版本4.2)进行一些异步HTTP请求。但是,result()由于出现异常:我无法强迫将来完成(使用),因为“
DummyFuture不支持阻止结果”。

我有python 3.4.3,因此将来的支持应该成为标准库的一部分。的文档concurrent.py说:

concurrent.futures.Future如果有龙卷风,将使用。否则,它将使用此模块中定义的兼容类。

下面提供了我尝试做的一个最小示例:

from tornado.httpclient import AsyncHTTPClient;

future = AsyncHTTPClient().fetch("http://google.com")
future.result()

如果我正确理解我的问题,则会发生此问题,因为concurrent.futures.Future未使用某种方式的导入。龙卷风中的相关代码似乎在其中,concurrent.py但是我在理解问题的根源方面并没有真正取得进展。

关注者
0
被浏览
128
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试创建另一个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装饰器使函数返回Future



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看