Python多进程:如何为不同核心占用量的程序分配专属物理核心并行执行
解决方案
可以通过CPU亲和性绑定实现你的需求——无论是Python多进程模块,还是直接用subprocess启动外部程序,都能指定进程运行的核心,确保并行任务的核心不重叠。以下是两种可行的实现方式:
一、基于subprocess + psutil(推荐,跨平台)
这种方式贴合你当前使用subprocess的习惯,通过psutil库直接给启动的外部进程绑定核心,操作简单且跨Windows/Linux/macOS。
步骤说明
- 提前分配好各程序的核心列表(确保无重叠,总占用核心数不超过8);
- 启动每个程序后,立即绑定到指定核心;
- 等待所有并行任务完成后,再启动
p8.exe并绑定全部8核。
代码示例
import subprocess import psutil # 定义各程序的核心分配(8核机器,核心编号从0开始) process_configs = [ {"exe": "p1.exe", "cores": [0]}, {"exe": "p2.exe", "cores": [1, 2]}, {"exe": "p4.exe", "cores": [3, 4, 5, 6]} ] running_procs = [] # 启动并行任务并绑定核心 for config in process_configs: proc = subprocess.Popen(config["exe"]) # 获取进程对象并设置CPU亲和性 ps_proc = psutil.Process(proc.pid) ps_proc.cpu_affinity(config["cores"]) running_procs.append(proc) # 等待所有并行任务执行完毕 for proc in running_procs: proc.wait() # 启动p8.exe并绑定全部8核 p8_proc = subprocess.Popen("p8.exe") ps_p8 = psutil.Process(p8_proc.pid) ps_p8.cpu_affinity(list(range(8))) p8_proc.wait()
二、基于Python多进程模块
如果希望用Python的multiprocessing管理任务,同样可以在子进程中设置CPU亲和性,再调用外部程序。
代码示例
import multiprocessing import psutil import subprocess def run_with_affinity(exe_path, cores): # 给当前子进程绑定核心 current_proc = psutil.Process() current_proc.cpu_affinity(cores) # 执行外部程序 subprocess.run(exe_path) if __name__ == "__main__": # 定义并行任务 tasks = [ ("p1.exe", [0]), ("p2.exe", [1, 2]), ("p4.exe", [3, 4, 5, 6]) ] # 启动多进程 procs = [] for exe, cores in tasks: p = multiprocessing.Process(target=run_with_affinity, args=(exe, cores)) p.start() procs.append(p) # 等待并行任务完成 for p in procs: p.join() # 执行p8.exe run_with_affinity("p8.exe", list(range(8)))
关键说明
- CPU亲和性:通过
cpu_affinity()方法指定进程只能在列表内的核心上运行,从根本上保证核心不重叠; - 跨平台兼容:
psutil库统一了Windows和类Unix系统的API,无需针对不同系统写分支代码; - 物理核心区分:如果需要严格绑定物理核心(而非逻辑核心),可以通过
psutil获取物理核与逻辑核的映射关系(比如Windows用psutil._psutil_windows.get_physical_cores(),Linux读取/sys下的拓扑文件),再调整核心分配列表。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

