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

Python多进程:如何为不同核心占用量的程序分配专属物理核心并行执行

解决方案

可以通过CPU亲和性绑定实现你的需求——无论是Python多进程模块,还是直接用subprocess启动外部程序,都能指定进程运行的核心,确保并行任务的核心不重叠。以下是两种可行的实现方式:

一、基于subprocess + psutil(推荐,跨平台)

这种方式贴合你当前使用subprocess的习惯,通过psutil库直接给启动的外部进程绑定核心,操作简单且跨Windows/Linux/macOS。

步骤说明

  1. 提前分配好各程序的核心列表(确保无重叠,总占用核心数不超过8);
  2. 启动每个程序后,立即绑定到指定核心;
  3. 等待所有并行任务完成后,再启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:50:44