Python遍历列表以在asyncio中获取api调用并保存结果

2024-04-25 21:55:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我还不完全理解asyncio和aiohttp是如何工作的。在

我试图从一个url列表发出一堆异步api请求,并将它们保存为一个变量,以便以后处理它们。在

到目前为止,我正在生成一个没有问题的列表并设置请求框架。在

urls = []
for i in range(0,20):
    urls.append('https://api.binance.com/api/v1/klines?symbol={}&interval= 
    {}&limit={}'.format(pairs_list_pairs[i],time_period,
            pull_limit))

import asyncio
import aiohttp


async def request(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            return await resp.text()


async def main():
    results = await asyncio.gather(
             request(urls[0]),
             request(urls[1]),
    )
    print(len(results))
    print(results)



loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
    loop.run_until_complete(loop.shutdown_asyncgens())
finally:
    loop.close()

如果我使用索引(如下所示)逐个手动键入我的请求,我就可以提出请求。但问题是我的列表中有超过100个api请求,我不想手工输入。我怎样才能遍历我的列表?另外,如何将结果保存到变量中?当脚本结束时,它不会在任何地方保存“结果”。在

^{pr2}$

下面是一些复制代码的示例URL:

[
 'https://api.binance.com/api/v1/klines?symbol=ETHBTC&interval=15m&limit=1',
 'https://api.binance.com/api/v1/klines?symbol=LTCBTC&interval=15m&limit=1',
 'https://api.binance.com/api/v1/klines?symbol=BNBBTC&interval=15m&limit=1',
 'https://api.binance.com/api/v1/klines?symbol=NEOBTC&interval=15m&limit=1',
]

Tags: httpscomloopapiasyncio列表asyncaiohttp
2条回答

使用gather和辅助函数(request)只会使一个相当简单的任务变得更加复杂和难以处理。您只需在所有单独的请求中使用相同的ClientSession,同时将每个响应保存到结果列表中。在

async def main():
    results = []
    async with aiohttp.ClientSession() as session:
        for url in urls:
            async with session.get(url) as resp:
                results.append(await resp.text())
    print(len(results))
    print(results)

对于你问题的另一部分,当你说:

When the script ends it does not save "results" anywhere.

如果您想访问results外部的results,那么只需添加一个return语句。在

main末尾,添加:

^{pr2}$

和改变

loop.run_until_complete(main())
# into:
results = loop.run_until_complete(main())

要向gather传递可变数量的参数,请使用*函数参数语法:

results = await asyncio.gather(*[request(u) for u in urls])

请注意,f(*args)是一个标准的Python特性,它使用在运行时计算的位置参数调用f。在

完成所有请求后,results将可用,并且它们将以与url相同的顺序排列在列表中。然后您可以从main返回它们,这将导致它们由run_until_complete返回。在

另外,如果只创建一次会话,并将其用于所有请求,例如将其作为第二个参数传递给request函数,则性能会更好。在

相关问题 更多 >