一起进行700个API调用并使用AWS Lambd合并数据

2024-04-25 07:12:15 发布

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

我有一个任务,其中我必须进行700个restapi调用。我使用了一个循环,但是循环的运行时间超过了AWS Lambda服务的超时时间。有没有什么方法可以同时调用并合并结果。我使用的是node 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]

Tags: inhttpscomapidatagetresponse时间
2条回答

您可以很容易地使用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

唯一的缺点是,如果任何一个承诺被拒绝,一切都会失败。所以我建议捕捉错误并用null或类似的方法解决。你知道吗

你可以做一个for循环来生成你的url数组,new Array(700).map(...),或者因为看起来你已经有了某种数组,只需.map()直接在请求函数中进行更多的转换。你知道吗

使用循环输入节点.js调用将同时运行,但要确保在退出lambda之前处理所有调用,需要某种形式的计数器来确保所有查询都已结束。你知道吗

示例:

var request = require('request');

var results = [];
var runningQueries = 0;
exchanges.forEach(function (item) {
  ++runningQueries;
  callAPI (item, function (err, data) { 
    if (err) {
      results.push(err)
       runningQueries;
    } else {
      results.push(data)
       runningQueries;
    }
    if (runningQueries == 0) {
      // all call results have been collated, so do something
    }
  })
})

您需要构建自己的callAPI函数。另外,我在这里对数组的内容有点懒散,但这只是给你一个框架。你知道吗

相关问题 更多 >