我需要在龙卷风请求处理程序中异步进行几个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
答案 0 :(得分:0)
您的意见用字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']
两种形式的协程之间的差异已记录在here
中