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

