如何解除Python(Jupyter Notebook)10%的CPU限制并自定义设置?
解决Jupyter Notebook/Python CPU限制问题
一、先定位CPU限制的根源
- 先搞清楚是系统层面的强制限制,还是代码本身没用到多核心:
- 打开系统监控工具(Windows任务管理器、Linux
htop、macOS活动监视器),查看Python进程的CPU占用情况。如果是10%左右,先检查:- 是不是系统给进程设置了CPU亲和性(只允许用某几个核心);
- 是不是代码是单线程逻辑,而你的机器有10个核心(单线程最多占10%左右,这是Python GIL的正常表现,不是被限制)。
- 打开系统监控工具(Windows任务管理器、Linux
二、突破CPU限制的具体方案
1. 解除系统级的CPU限制
- Windows:
打开任务管理器 → 找到Jupyter/Python进程 → 右键选择「转到详细信息」→ 再次右键该进程 → 「设置相关性」→ 勾选所有可用的CPU核心。 - Linux/macOS:
- 先排查是否有
cpulimit工具在限制进程:运行ps aux | grep cpulimit,如果有对应的限制进程,直接终止它。 - 调整CPU亲和性:先通过
ps aux | grep python找到进程PID,然后运行taskset -c 0-<核心数-1> <PID>(比如8核机器就用0-7),让进程能使用所有核心。
- 先排查是否有
2. 优化代码利用多核心(针对单线程瓶颈)
如果是单线程代码因为GIL只能用一个核心,就改成多进程模式(CPU密集任务用多进程,IO密集用多线程):
- 用
multiprocessing模块拆分任务:
from multiprocessing import Pool def heavy_calc(num): # 这里写你的CPU密集型计算逻辑 return sum(range(num)) if __name__ == '__main__': # processes设为你的CPU核心数 with Pool(processes=4) as pool: results = pool.map(heavy_calc, [1000000]*4)
- 用
concurrent.futures更简洁实现:
from concurrent.futures import ProcessPoolExecutor def heavy_calc(num): return sum(range(num)) with ProcessPoolExecutor(max_workers=4) as executor: results = list(executor.map(heavy_calc, [1000000]*4))
3. 检查Jupyter自身配置
Jupyter默认没有CPU限制,但如果是用conda或第三方工具启动的,可能有隐藏配置:
- 先运行
jupyter notebook --generate-config生成配置文件,打开后搜索resource_use_display相关项,确保没有设置CPU限制的参数。 - 如果用JupyterLab,检查是否安装了资源限制类的扩展,有的话直接禁用或调整设置。
三、自定义CPU限制阈值
如果是需要主动限制CPU占用(而非解除限制),可以这么做:
- Windows:用任务管理器右键进程→「设置优先级」,或者用Process Lasso这类工具自定义限制比例。
- Linux/macOS:
- 用
cpulimit工具:cpulimit -p <PID> -l 50(限制该进程CPU占用不超过50%)。 - 用
renice调整优先级:renice -n 10 <PID>(数值越大,进程优先级越低,CPU分配越少)。
- 用
内容的提问来源于stack exchange,提问作者balalala
相关产品推荐
相关产品推荐

