为了账号安全,请及时绑定邮箱和手机立即绑定

龙卷风不能正确产生期货

龙卷风不能正确产生期货

千巷猫影 2021-10-26 13:38:52
我需要在龙卷风请求处理程序中异步进行多个 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']

两种协程风格之间的差异记录在此处


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信