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

Python multiprocessing限制核心数后仍占用全部核心问题排查

问题原因分析

你遇到的核心占用超标的问题,本质是multiprocessing进程池与NumPy多线程运算的叠加冲突:

  • 你通过multiprocessing.Pool(10)开启了10个工作进程,但每个进程内的NumPy线性代数运算(如矩阵乘法@、np.dot)默认依赖OpenBLAS/MKL等多线程后端库,每个子进程会自动占用多个CPU核心。
  • 本次conda全量更新可能调整了NumPy的后端配置(比如启用了多线程并行,或修改了默认线程数),导致之前未触发的资源叠加问题显现。
解决方案

1. 在代码中限制NumPy线程数

在导入NumPy前设置环境变量,强制每个子进程中的NumPy运算仅使用1个线程,确保10个进程总核心占用不超过10:

import os
# 针对不同线性代数后端设置线程数
os.environ["OPENBLAS_NUM_THREADS"] = "1"  # OpenBLAS后端
os.environ["MKL_NUM_THREADS"] = "1"       # MKL后端
os.environ["OMP_NUM_THREADS"] = "1"       # 通用OpenMP控制

import numpy as np
import multiprocessing

def square(i):
    size = 10000
    return np.dot(np.random.normal(size=size), np.random.normal(size=(size, size)) @ np.random.normal(size=size))

with multiprocessing.Pool(10) as pool:
    t = pool.map(square, range(100))

2. 确认NumPy后端类型

如果不确定当前使用的是OpenBLAS还是MKL,可运行以下代码查看:

import numpy as np
print(np.__config__.show())

根据输出结果,针对性设置对应的环境变量即可。

3. JupyterHub全局配置(可选)

若不想每次修改代码,可在JupyterHub启动前设置环境变量:

  • 终端中执行:
    export OPENBLAS_NUM_THREADS=1
    export MKL_NUM_THREADS=1
    
  • 或在Notebook开头添加魔法命令(仅当前Notebook生效):
    %env OPENBLAS_NUM_THREADS=1
    %env MKL_NUM_THREADS=1
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:21:58