You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tornado异步查询报错'DummyFuture不支持阻塞获取结果'求助

解决Tornado异步查询中的"DummyFuture does not support blocking for results"错误

Hey,我一眼就瞅出你代码里的问题啦——这个报错本质是因为你没正确用Tornado的协程机制处理异步操作,让我给你拆解清楚,再给你修正后的代码:

核心问题分析

你定义的request是普通函数,但里面用了yield关键字。在Tornado里,异步操作必须放在协程函数里执行:要么用新版本推荐的async def,要么用旧版的@gen.coroutine装饰器。如果普通函数里用yield,Tornado会把它当成普通生成器处理,返回的DummyFuture根本不支持阻塞获取结果,这就是你看到错误的根源。

修正后的代码示例

新版本Tornado(推荐用async/await)

from tornado import httpclient
from tornado.web import RequestHandler  # 假设你在请求处理器中使用,单独用协程也可以

query_url = 'https://some_url.com'
http_client = httpclient.AsyncHTTPClient()

# 标记为异步协程函数
async def request(query_url):
    # 用await等待异步请求完成
    resp = await http_client.fetch(query_url, method="GET")  # 补全你的method参数,比如GET/POST
    # 按需处理响应,比如返回解码后的内容
    return resp.body.decode('utf-8')

# 如果是在RequestHandler中使用,处理器方法也要定义为async
class MyAsyncHandler(RequestHandler):
    async def get(self):
        result = await request(query_url)
        self.write(result)

旧版本Tornado(<5.0,用@gen.coroutine装饰器)

from tornado import httpclient, gen

query_url = 'https://some_url.com'
http_client = httpclient.AsyncHTTPClient()

# 用装饰器标记为协程
@gen.coroutine
def request(query_url):
    resp = yield http_client.fetch(query_url, method="GET")
    # 旧版协程需要用gen.Return返回结果
    raise gen.Return(resp.body.decode('utf-8'))

# 在RequestHandler中使用时,同样要装饰处理器方法
class MyAsyncHandler(RequestHandler):
    @gen.coroutine
    def get(self):
        result = yield request(query_url)
        self.write(result)

额外注意事项

  • 调用这个异步函数的上下文也必须是协程/异步环境,不能在普通同步函数里直接调用request()然后试图拿结果,不然还是会触发相同错误。
  • 记得补全http_client.fetch的参数,比如你代码里的meth...应该是method参数,明确请求类型。

内容的提问来源于stack exchange,提问作者Jimmy Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:14