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

为何Python多进程池指定50核却占用服务器全部128核?

进程池设50核却占满128核的原因分析

你的问题核心原因几乎可以确定是**sample()函数内部的实现触发了额外并行计算**,和进程池本身的设置无关,具体拆解如下:

  • 进程池的num_cores=50只是限制主进程创建的worker进程数量,但每个worker进程如果内部又启动了多线程/多进程操作,就会突破这个限制。
  • 最常见的场景是:sample()里调用了默认启用多线程的数值计算库(比如NumPy、Pandas、OpenBLAS、MKL、PyTorch等),这些库默认会占用服务器所有可用CPU核心,完全不受父进程的进程池限制。
  • 另一种可能是sample()内部自己使用了multiprocessing/threading创建了新的子进程/线程,或者调用了本身会占用大量CPU的外部脚本/工具。

验证方法

把sample()改成极简逻辑,比如:

def sample():
    return 1

重新运行脚本后看htop的CPU使用率,如果此时只占用约50核,就完全能确认是sample()内部的并行逻辑导致的问题。

解决思路

  1. 限制第三方库的线程数:
    • 针对OpenBLAS/MKL这类线性代数库,在脚本开头添加环境变量设置:
      import os
      os.environ["OMP_NUM_THREADS"] = "1"  # 适配OpenBLAS
      os.environ["MKL_NUM_THREADS"] = "1"  # 适配MKL
      
    • 针对PyTorch,添加:
      import torch
      torch.set_num_threads(1)
      
  2. 调整sample()内部逻辑:
    • 如果是自己在sample()里写了并行代码,要么去掉嵌套并行,要么限制内部并行的核心数(比如内部再开进程池时指定更小的核数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:01