我需要在龙卷风请求处理程序中异步进行多个 http 调用。试图返回期货没有得到很好的记录,并且在龙卷风的处理程序级别收集的 asyncio.gather 上几乎不可能做到。我试过 aiohttp ,它本身工作正常,但是当把它放在龙卷风处理程序中时,它抛出的循环已经在使用中。如果你能告诉我如何向 IOLoop 注入一些新的未来来解决,那就太好了。我也尝试过使用AsyncHTTPClient与文档相反的龙卷风,它实际上并不使用 yield 而是在您使用 await 时返回响应。是否有任何关于此的最新文档?所有示例都不适用于多个异步请求。根据本文档http://www.tornadoweb.org/en/stable/gen.html#module-tornado.gen@gen.coroutinedef get(self): http_client = AsyncHTTPClient() response1, response2 = yield [http_client.fetch(url1), http_client.fetch(url2)] response_dict = yield dict(response3=http_client.fetch(url3), response4=http_client.fetch(url4)) response3 = response_dict['response3'] response4 = response_dict['response4']但是,当我自己尝试这样做时,yield 会引发错误,将其替换为 await 会得到结果。但是你不能像 yield 这样的 dict 对象等待。我怎样才能解决这个问题?蟒蛇 3.6.7 龙卷风 5.1.1 aiohttp 3.5.4
1 回答
青春有我
TA贡献1784条经验 获得超8个赞
您的评论使用了 一词await,因此听起来您遇到了本机协程(用async def和定义await)和装饰协程(用@gen.coroutine和定义)之间的差异yield。您只能yield直接在修饰的协程中列出和字典。
在本机协程中,您必须使用tornado.gen.multi(或asyncio.gather):
async def get(self):
http_client = AsyncHTTPClient()
response1, response2 = await gen.multi([http_client.fetch(url1),
http_client.fetch(url2)])
response_dict = await gen.multi(dict(response3=http_client.fetch(url3),
response4=http_client.fetch(url4)))
response3 = response_dict['response3']
response4 = response_dict['response4']
两种协程风格之间的差异记录在此处
添加回答
举报
0/150
提交
取消