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
相关产品推荐
相关产品推荐

