python - 一起进行 700 个 API 调用并使用 AWS Lambda 合并数据
问题描述
我有一个任务,我必须进行 700 次 REST API 调用。我使用了一个循环,但是循环的运行时间超过了 AWS Lambda 服务的超时时间。有什么方法可以同时拨打电话并合并结果。我正在使用节点 JS,但也欢迎使用 python 中的解决方案
这是我现在正在运行的代码示例:
HitBTCData = {}
for item in exchanges:
itemlist = item.split('-')
response = requests.get('https://min-
api.cryptocompare.com/data/histominute?
fsym='+itemlist[0]+'&tsym='+itemlist[1]+'&limit=2000&aggregate=1
&e=HitBTC').json()
if itemlist[0]+itemlist[1] not in HitBTCData:
HitBTCData[itemlist[0]+itemlist[1]] = []
HitBTCData[itemlist[0]+itemlist[1]].append(response['Data'])
while response['Type'] != 1:
time = response['TimeFrom']
response = requests.get('https://min-
api.cryptocompare.com/data/histominute?
fsym='+itemlist[0]+'&tsym='+itemlist[1]+
'&limit=2000&aggregate=1&toTs='+str(time)+'&e=HitBTC').json()
if response['Type'] != 1:
HitBTCData[itemlist[0]+itemlist[1]]
.append(response['Data'])
HitBTCData[itemlist[0]+itemlist[1]] =
HitBTCData[itemlist[0]+itemlist[1]][::-1]
解决方案
你可以很容易地做到这一点Promise.all()
:
const urls = [...];
const requestFunction = async (url) => {
// all your ifs go here
let data = await request(url);
// transform/sanitize your data
return data;
}
const allResults = await Promise.all(urls.map(requestFunction));
// you now have an array of results
唯一的缺点Promise.all()
是,如果任何一个 Promise 被拒绝,一切都会失败。所以我建议捕捉错误并解决null
或类似的东西。
你可以做一个for
循环来生成你的 URL 数组new Array(700).map(...)
,或者因为看起来你已经有了某种数组,就.map()
直接在请求函数中做更多的转换。
推荐阅读
- vue.js - 如何通过单击Vue中的另一个div(按钮)来显示隐藏的div?
- bash - 使用 find 查找自上次早上 6 点以来未修改的文件
- python - 替换非有限的numpy元素
- flutter - 请确保 SDK 和/或项目安装在 mac os 中具有读/写 Flutter 项目的位置
- firebase-realtime-database - 尝试连接到 Firebase 时出现错误 603
- python - 如何使用 fpdf 模块在 Python 中的单元格周围环绕文本
- c# - 为什么 Asp.net Core Identity 的 UserRoles 中有两个额外的列?
- python - GPU 不能在 tensorflow 中训练神经网络
- matlab - 结合两个用 Psychtoolbox 编写的视觉实验
- generics - 在 C# 中使用 Generic 使用递归遍历树结构