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

Python多进程实现批量POST请求:1万司机数据1分钟更新方案求助

多进程批量更新司机状态优化方案

当前通过单循环遍历字典列表逐个发送POST请求更新司机状态,IO等待导致效率低下,目标是1分钟内完成1万条数据更新,以下是基于多进程分块处理的优化方案:

核心思路

利用concurrent.futures.ProcessPoolExecutor实现多进程并行处理,将1万条司机数据分块后分配给不同进程,同时发起HTTP请求,通过并行IO操作提升整体效率。

完整代码实现

import requests
from concurrent.futures import ProcessPoolExecutor
import math

# 全局复用请求头,所有进程共享
headers = {
    "accept": "application/json",
    "content-type": "application/json",
    "authorization": "#########"
}
# 基础URL模板
post_url = "https://api.xyz.com/v1/test/drivers/{}/daily_status/duty_status"

def update_single_driver(driver_info):
    """单个司机状态更新的核心函数,供进程调用"""
    try:
        # 拼接目标URL
        target_url = post_url.format(driver_info['driver_id'])
        # 构造请求体
        payload = {
            "status": driver_info['status_type'],
            "remark": driver_info['remark'],
            "time": driver_info['time']
        }
        # 发送POST请求
        response = requests.post(target_url, json=payload, headers=headers)
        # 返回处理结果(可根据需求调整)
        if response.status_code in (200, 201):
            return f"司机{driver_info['driver_id']}状态更新成功"
        else:
            return f"司机{driver_info['driver_id']}更新失败,状态码:{response.status_code}"
    except Exception as e:
        return f"司机{driver_info['driver_id']}更新出错:{str(e)}"

def batch_update_drivers(details, process_count=8):
    """批量更新入口函数,负责数据分块与多进程调度"""
    # 计算每个进程处理的数据块大小
    chunk_size = math.ceil(len(details) / process_count)
    # 将数据列表拆分为多个子块
    data_chunks = [details[i:i+chunk_size] for i in range(0, len(details), chunk_size)]
    
    # 启动多进程池执行任务
    with ProcessPoolExecutor(max_workers=process_count) as executor:
        # 每个进程处理一个数据块
        chunk_results = executor.map(lambda chunk: [update_single_driver(info) for info in chunk], data_chunks)
    
    # 收集所有处理结果
    all_results = []
    for result in chunk_results:
        all_results.extend(result)
    return all_results

# 主程序入口(Windows系统必须加此判断,避免进程创建异常)
if __name__ == "__main__":
    # 替换为你的实际1万条司机数据列表
    driver_details = [
        {"driver_id": "123", "status_type": "ON_DUTY", "remark": "testing", "time": 1670009505000}
        for _ in range(10000)
    ]
    # 执行批量更新
    update_results = batch_update_drivers(driver_details)
    # 可按需打印或保存结果(示例打印前10条)
    for res in update_results[:10]:
        print(res)

关键注意事项

  • 进程数设置:建议设置为CPU核心数的2-4倍(比如8核CPU开8-16个进程),过多进程会增大系统调度开销,还可能触发后端API限流。
  • API限流适配:提前确认后端API的并发/QPS限制,若有限制,可在update_single_driver函数中添加time.sleep(0.01)之类的延迟,避免被封禁。
  • 失败重试:对请求失败的场景,可引入重试逻辑(比如用tenacity库),提升任务成功率。
  • 数据分块调整:分块大小可根据实际情况微调,比如每块100-500条数据,平衡进程负载。

内容的提问来源于stack exchange,提问作者Rsoll3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:25:30