如何用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
相关产品推荐
相关产品推荐

