如何在Windows上优先通过环境变量限制os.cpu_count返回的CPU核心数?
解决方案
你此前尝试的方案未生效的核心原因:Windows版本的Python内置
os.cpu_count底层调用Win32 APIGetSystemInfo获取系统全局逻辑处理器总数,既不读取NUMBER_OF_PROCESSORS环境变量,也不感知进程CPU亲和性限制,因此上述操作无法修改该函数的返回值。
以下方案均无需修改原应用代码,按稳定性优先级排序:
方案1:使用微软官方兼容性垫片伪造CPU核心数(最推荐)
这是微软官方提供的适配方案,专门用于处理对核心数敏感的旧程序,配置后仅对目标应用生效,完全不影响其他程序运行:
- 在微软官方站点搜索「Windows 评估和部署工具包(ADK)」下载安装,安装时仅勾选「应用程序兼容性工具」组件即可
- 打开兼容性管理员(Compatibility Administrator),新建自定义数据库,添加你要限制的第三方exe程序,添加兼容性垫片时选择
Processor Count,设置数值为2 - 保存数据库后安装该兼容性规则,之后该程序启动时会自动被伪造CPU核心数为2,
os.cpu_count直接返回2,每个应用最多启动2个工作进程
方案2:PowerShell单进程临时设置环境变量(适配老版本Python打包程序)
部分使用Python 3.8以下版本打包的程序,os.cpu_count会 fallback 读取进程独有环境变量中的NUMBER_OF_PROCESSORS,你可以通过以下方式为单个进程单独设置该变量,不会修改全局环境变量:
# 仅为当前PowerShell会话设置临时环境变量,仅对当前会话启动的子进程生效 $env:NUMBER_OF_PROCESSORS = 2 # 启动目标应用 .\你的第三方应用路径.exe
启动完成后关闭PowerShell窗口,环境变量自动失效。
方案3:API Hook 拦截返回值(特殊场景使用)
如果上述方案都不生效,可以使用轻量Hook工具拦截目标程序的GetSystemInfo调用,强制修改返回的处理器数值为2:
- 自行编写仅Hook
GetSystemInfo修改dwNumberOfProcessors字段的极小DLL - 启动目标程序时用Process Hacker等工具自动注入DLL即可
内容的提问来源于stack exchange,提问作者grayfallstown
相关产品推荐
相关产品推荐

