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

Python新手求助:批量发送POST请求的高效实现方案

提升Python POST请求发送速度的实用方案

Hey Mike, 我完全懂你现在的困扰——刚接触requests和并发的时候,要么单循环速度慢得让人着急,要么一不小心把进程开太多搞崩电脑,太闹心了!咱们一步步来解决这个问题:

为什么单循环速度这么慢?

requests是同步阻塞的库,每个请求都得等前一个请求完成(包括网络等待时间)才能发下一个。大部分网络请求的时间都花在等待服务器响应上,这部分时间完全可以用来发其他请求,所以单循环才会效率极低。

关于Multiprocessing:别盲目开太多进程!

你之前电脑死机,核心问题是进程创建得太多。进程的系统开销很大(每个进程都要占用独立的内存空间),远超线程。所以用多进程的时候,一定要控制数量:

  • 一般来说,进程数设置成和你的CPU核心数一致(比如4核就设4),最多不超过核心数的2倍,避免资源耗尽。
  • 推荐用multiprocessing.Pool来管理进程池,它会帮你自动控制进程数量,不用手动创建每个进程。

多进程示例代码

import requests
from multiprocessing import Pool

def send_post_request(params):
    url, data = params
    try:
        response = requests.post(url, data=data, timeout=10)
        # 这里可以处理响应,比如返回状态码
        return response.status_code
    except Exception as e:
        return str(e)

if __name__ == "__main__":
    # 准备所有请求的参数:列表里每个元素是(url, data)
    requests_list = [
        ("https://your-target-url.com", {"key1": "value1"}),
        ("https://your-target-url.com", {"key2": "value2"}),
        # 更多请求...
    ]
    
    # 创建进程池,设置进程数为4(根据你的CPU核心数调整)
    with Pool(processes=4) as pool:
        # 批量执行请求
        results = pool.map(send_post_request, requests_list)
    
    # 处理结果
    for idx, res in enumerate(results):
        print(f"请求{idx+1}结果: {res}")

更适合网络请求的:多线程(ThreadPoolExecutor)

网络请求属于IO密集型任务,多线程其实比多进程更高效——线程的系统开销小得多,能开更多的并发数(比如20-50个,根据服务器承受能力调整)。用concurrent.futures.ThreadPoolExecutor比手动管理线程简单太多:

多线程示例代码

import requests
from concurrent.futures import ThreadPoolExecutor

def send_post_request(params):
    url, data = params
    try:
        response = requests.post(url, data=data, timeout=10)
        return response.status_code
    except Exception as e:
        return str(e)

if __name__ == "__main__":
    requests_list = [
        ("https://your-target-url.com", {"key1": "value1"}),
        ("https://your-target-url.com", {"key2": "value2"}),
        # 更多请求...
    ]
    
    # 设置线程数为20(可以根据测试调整,别太夸张)
    with ThreadPoolExecutor(max_workers=20) as executor:
        results = list(executor.map(send_post_request, requests_list))
    
    for idx, res in enumerate(results):
        print(f"请求{idx+1}结果: {res}")

进阶方案:异步请求(aiohttp)

如果想追求极致速度,可以用异步HTTP库aiohttp,它能在单线程里处理大量并发请求,效率比多线程还高。不过需要你稍微学习下异步语法(async/await):

异步示例代码

import aiohttp
import asyncio

async def send_post_request(session, url, data):
    try:
        async with session.post(url, data=data, timeout=10) as response:
            return await response.status()
    except Exception as e:
        return str(e)

async def main():
    requests_list = [
        ("https://your-target-url.com", {"key1": "value1"}),
        ("https://your-target-url.com", {"key2": "value2"}),
        # 更多请求...
    ]
    
    # 创建异步会话
    async with aiohttp.ClientSession() as session:
        # 批量创建任务
        tasks = [send_post_request(session, url, data) for url, data in requests_list]
        # 执行所有任务
        results = await asyncio.gather(*tasks)
    
    for idx, res in enumerate(results):
        print(f"请求{idx+1}结果: {res}")

if __name__ == "__main__":
    asyncio.run(main())

关键注意事项

  • 控制并发数:不管用哪种方案,都别把并发数设得太高——不仅会搞崩自己的电脑,还可能被目标服务器判定为攻击,直接封禁你的IP。先从小的数值(比如10、20)测试,慢慢调整到合适的范围。
  • 添加超时和重试:网络请求很容易失败,一定要设置timeout,并可以用tenacity库实现重试机制,避免偶然的网络波动导致请求失败。
  • 异常处理:每个请求都要加try-except,避免单个请求失败导致整个程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:41:21