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

如何优化Python多进程以最大化CPU核心使用率并提升运行速度

多进程CPU利用率偏低的核心原因及优化方案

你当前代码存在的关键问题

  • 跨进程内存隔离导致逻辑完全失效
    Python多进程默认是内存独立拷贝的,你在子进程process里修改的unique_list、statistics里访问的domains,都是每个子进程各自带的一份内存副本,所有修改都不会同步回主进程。你之前第一种实现能跑满100% CPU,本质是每个子进程独立跑循环没有阻塞,但因为内存隔离的问题,最终输出的去重结果其实根本不是全局的正确值。另外你代码里初始化了mp.Pool之后完全没使用,转头又手动循环开mp.Process,既空占了进程池的资源,又没享受到进程池的调度能力。
  • O(n²)复杂度的无效遍历吃掉了大部分运行时间
    你两个核心循环里的操作都是线性级别的时间开销:循环内判断item not in unique_list、每次调用domains.count(item),都是对整个列表做全量遍历。比如待统计的域名列表有10万条,每查一个item就要从头扫一遍全表,实际有效计算占比极低,CPU根本没在做有用的运算,自然利用率上不去。
  • IO锁争抢导致进程空等
    你在statistics函数里让每个子进程直接打开同一个result.txt文件写入,多进程同时操作同一个文件会触发操作系统的文件锁争抢,所有进程都要排队等锁,根本跑不满CPU。
  • 任务拆分逻辑粗糙,进程调度效率低
    手动循环开进程、join的方式,没有进程复用能力,每次跑任务都要反复创建/销毁进程,额外开销极大;加上块大小计算时直接取整,很容易出现部分核心早早就完成任务空等、部分核心还在慢慢跑的负载不均问题。

针对性优化步骤

  • 先把线性查找替换为哈希结构,从根上降低计算开销
    把需要做成员判断的列表全部换成set,需要批量计数的列表提前用collections.Counter转成带计数的字典。原来需要全表遍历的成员判断、计数操作,会变成常数时间级别的查询,单线程运行速度就能提升几十上百倍,这一步是多进程能跑满CPU的基础——如果单步操作的时间开销极小,多进程调度的开销占比会反过来拖慢整体速度。
  • 修正多进程逻辑,避免跨进程写共享内存
    不要让子进程直接修改主进程的全局列表。每个子进程只需要处理自己分到的块数据,把处理结果收集好返回给主进程,由主进程统一做去重、合并、统计的操作。比如process函数不需要在子进程里往unique_list里append,只需要把自己块里提取到的域名收集成临时列表返回,主进程收完所有子进程的结果,再合并成一个set做去重,全程没有跨进程写操作,完全不需要加锁。
  • 正确使用进程池替换手动开进程的写法
    不管用multiprocessing.Pool还是concurrent.futures.ProcessPoolExecutor,都要做到:
    • 进程数和CPU核心数对齐,不要开多余的进程
    • 把分好的数据块提交给进程池调度,不要手动循环start()/join(),靠进程池实现进程复用,减少反复创建进程的开销
    • 删掉原来没用上的空Pool初始化代码,避免资源浪费
  • 把文件IO操作移出进程计算流程
    不要让子进程直接写文件。等所有进程把统计结果返回主进程后,由主进程一次性把结果写入文件,全程让子进程只做纯CPU计算,没有IO阻塞,自然能把核心利用率拉满。
  • 调整任务拆分粒度,避免负载不均
    计算块大小时可以把长度计算改为向上取整,保证所有块的长度差不超过1;如果单块任务量过小,可以适当拆分为更多小块,让进程池自动调度任务,避免部分核心空转。

多数情况下多进程跑不满CPU,根本不是多进程机制的问题,而是代码里混了太多阻塞类操作(线性遍历、IO锁争抢、跨进程同步),把这些阻塞点全部优化掉,才能真正榨干所有CPU核心的性能。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 07:54:00