为何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()内部的并行逻辑导致的问题。
解决思路
- 限制第三方库的线程数:
- 针对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)
- 针对OpenBLAS/MKL这类线性代数库,在脚本开头添加环境变量设置:
- 调整
sample()内部逻辑:- 如果是自己在
sample()里写了并行代码,要么去掉嵌套并行,要么限制内部并行的核心数(比如内部再开进程池时指定更小的核数)。
- 如果是自己在
内容的提问来源于stack exchange,提问作者Tendero
相关产品推荐
相关产品推荐

