龙卷风不能正确产生期货

时间:2019-01-31 17:40:19

标签: python tornado future yield aiohttp

我需要在龙卷风请求处理程序中异步进行几个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对象。我该如何解决?

python 3.6.7 龙卷风5.1.1 aiohttp 3.5.4

1 个答案:

答案 0 :(得分:0)

您的意见用字await,所以它听起来就像你在运行的本地协同程序之间(async def与定义await)和装饰协同程序的不同(与定义@gen.coroutineyield)。您只能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']

两种形式的协程之间的差异已记录在here