如何为Python 3的subprocess子进程设置CPU亲和性?
Windows平台为subprocess子进程设置CPU亲和性的实现方案
以下方案均兼容Python 3.8、Windows 7/10运行环境,无需修改原有数据记录器子程序代码:
方法1:无额外依赖的内置命令实现
通过Windows cmd自带的start命令的/affinity参数,在启动子进程时直接指定亲和性,不需要安装第三方库:
- 亲和性规则:使用16进制数作为掩码,每一位对应一个CPU核心,最低位对应第0个物理核心。例如绑定第0核心填
0x1,绑定第0、2核心填0x5(二进制为101) - 代码示例:
import subprocess # 替换为你需要的亲和性掩码 affinity_mask = "0x1" # 替换为你的数据记录器程序路径,路径包含空格时需要用双引号包裹 logger_path = '"C:\\path with space\\logger.exe"' proc = subprocess.Popen( f"start /affinity {affinity_mask} {logger_path}", shell=True, # 你原有subprocess的其他参数(如stdout、stdin配置等)保持不变即可 )
优点:配置逻辑全部在父进程完成,无需额外依赖,适配所有Windows版本。
方法2:支持动态调整的pywin32实现
如果需要在子进程运行过程中修改亲和性,或者不想启用shell=True,可以通过pywin32库操作Windows系统API实现:
- 先安装依赖:
pip install pywin32 - 代码示例:
import subprocess import win32api import win32con import win32process # 正常启动子进程,原有参数保持不变 proc = subprocess.Popen(["C:\\path\\to\\logger.exe"]) # 获取子进程句柄并设置亲和性 process_handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, proc.pid) # 第二个参数为亲和性掩码,此处示例为绑定第0、1核心(掩码0x3) win32process.SetProcessAffinityMask(process_handle, 0x3) win32api.CloseHandle(process_handle)
注意事项
- 1KHz高频数据记录器建议绑定到单个物理核心,避免跨核心上下文切换带来的时序抖动,不建议绑定到多个超线程逻辑核心
- 掩码数值不能超过当前设备的CPU核心总数对应的最大值,例如4核心设备最大掩码为
0xF(对应十进制15)
内容的提问来源于stack exchange,提问作者PEJ
相关产品推荐
相关产品推荐

