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

如何为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实现:

  1. 先安装依赖:pip install pywin32
  2. 代码示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:09