龙卷风不能正确产生期货

我需要在龙卷风请求处理程序中异步进行多个 http 调用。


试图返回期货没有得到很好的记录,并且在龙卷风的处理程序级别收集的 asyncio.gather 上几乎不可能做到。


我试过 aiohttp ,它本身工作正常,但是当把它放在龙卷风处理程序中时,它抛出的循环已经在使用中。如果你能告诉我如何向 IOLoop 注入一些新的未来来解决,那就太好了。


我也尝试过使用AsyncHTTPClient与文档相反的龙卷风,它实际上并不使用 yield 而是在您使用 await 时返回响应。


是否有任何关于此的最新文档?所有示例都不适用于多个异步请求。


根据本文档http://www.tornadoweb.org/en/stable/gen.html#module-tornado.gen


@gen.coroutine

def 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


千巷猫影
浏览 161回答 1
1回答

青春有我

您的评论使用了 一词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']两种协程风格之间的差异记录在此处
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python