我还不完全理解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',
]
使用
gather
和辅助函数(request
)只会使一个相当简单的任务变得更加复杂和难以处理。您只需在所有单独的请求中使用相同的ClientSession
,同时将每个响应保存到结果列表中。在对于你问题的另一部分,当你说:
如果您想访问
results
外部的results
,那么只需添加一个return
语句。在在
^{pr2}$main
末尾,添加:和改变
要向
gather
传递可变数量的参数,请使用*
函数参数语法:请注意,
f(*args)
是一个标准的Python特性,它使用在运行时计算的位置参数调用f
。在完成所有请求后,
results
将可用,并且它们将以与url相同的顺序排列在列表中。然后您可以从main
返回它们,这将导致它们由run_until_complete
返回。在另外,如果只创建一次会话,并将其用于所有请求,例如将其作为第二个参数传递给
request
函数,则性能会更好。在相关问题 更多 >
编程相关推荐