You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python拆分数组并并行发起requests.get请求解决URL过长问题

解决方案:拆分ID批量并行请求并合并结果

针对URL长度超限的问题,我们可以将bar_ids按每组10个拆分,通过线程池并行发起多个GET请求,最后合并所有有效响应的结果返回。

修改后的代码实现

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed

def get_foo_by_bars(authorisation_token: str, bar_ids: list):
    # 将bar_ids按每组10个拆分
    chunk_size = 10
    bar_chunks = [bar_ids[i:i+chunk_size] for i in range(0, len(bar_ids), chunk_size)]
    
    all_results = []
    request_headers = {"Authorization": authorisation_token}
    target_url = BASE_URL + "/api/v1/foo/bar"
    
    # 使用线程池并行执行请求
    with ThreadPoolExecutor(max_workers=5) as executor:
        # 提交所有拆分后的请求任务
        future_map = {
            executor.submit(
                requests.get,
                target_url,
                params={"bar_ids": chunk, "data_type": "Float"},
                headers=request_headers
            ): chunk for chunk in bar_chunks
        }
        
        # 逐个处理完成的请求
        for future in as_completed(future_map):
            chunk = future_map[future]
            try:
                response = future.result()
                if response.status_code == 200:
                    # 提取并合并有效数据
                    result_data = response.json()["data"]["data"]
                    all_results.extend(result_data)
                else:
                    # 可根据需求调整错误处理逻辑,比如记录日志
                    print(f"请求失败,状态码: {response.status_code},对应ID组: {chunk}")
            except Exception as e:
                # 处理网络异常、JSON解析失败等情况
                print(f"请求异常: {str(e)},对应ID组: {chunk}")
    
    return all_results

关键逻辑说明

  • ID分组拆分:通过列表推导式将长列表拆分为多个长度为10的子列表,从根源避免URL长度超标。
  • 并行请求优化:使用ThreadPoolExecutor发起并行请求,max_workers可根据API的并发限制调整(建议5-10),相比串行请求大幅提升效率。
  • 结果合并与容错:通过as_completed实时处理完成的请求,合并所有成功响应的数据;同时增加异常和非200状态码处理,避免单个请求失败导致整个任务中断。

内容的提问来源于stack exchange,提问作者Stéphane GRILLON

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:01:11