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

Python并行处理25个对象的实现及多进程耗时高于串行问题咨询

问题根因

你的业务场景属于IO密集型任务,调用API发起GET请求的绝大多数耗时都消耗在等待网络响应上,全程CPU占用极低。
你选用的多进程方案是为CPU密集型任务设计的,进程启动、上下文切换、进程间数据传输都有很高的额外开销,针对25个轻量请求的场景,这部分额外开销已经超过了并行节省的IO等待时间,所以会出现比串行运行更慢的情况。

适配方案选择

针对你的场景,优先级从高到低如下:

  • 首选多线程:Python的全局解释器锁(GIL)会在IO等待时自动释放,多线程可以充分利用请求等待的空窗期处理其他任务,且线程的创建、调度开销远低于进程,几乎没有额外性能损耗,代码改造成本也最低。
  • 次选异步IO:资源利用率比多线程更高,适合请求量更大的场景,但需要将原有同步请求逻辑改造为异步版本,改造成本稍高。
  • 完全不推荐多进程:仅适合CPU占用高的计算类场景,用在IO密集型场景属于方案错配。
具体实现代码

多线程实现(推荐,改造成本极低)

from concurrent.futures import ThreadPoolExecutor

# max_workers可以设置为5~25之间的数值,IO密集型场景线程数稍高不会有性能问题
with ThreadPoolExecutor(max_workers=10) as pool:
    output = list(pool.map(get_results, response_obj))

运行后耗时基本和串行场景下最慢的单个请求耗时接近,远低于串行总耗时。

异步IO实现(适合后续扩展到更大请求量)

需要将原有同步的GET请求改造为异步逻辑,示例如下:

import asyncio
import aiohttp

async def aget_results(session, req_param):
    # 替换为你的实际请求逻辑
    async with session.get("你的API接口地址", params=req_param) as resp:
        return await resp.json()

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [aget_results(session, param) for param in response_obj]
        output = await asyncio.gather(*tasks)
    return output

output = asyncio.run(main())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:00:03