
python 的 `multiprocessing.pool` 本身不支持直接指定“每进程分配 n 个 cpu 核心”,但可通过合理计算进程数、结合 `psutil` 或 `os.sched_setaffinity` 手动绑定 cpu 核心,实现近似效果。本文详解原理、安全计算方式与实用示例。
标准 multiprocessing.Pool 的第一个参数 processes 表示启动的进程数量,而非对每个进程的资源配额。操作系统负责将这些进程调度到可用核心上,但默认不保证独占或绑定——这意味着多个进程可能竞争同一核心,导致实际并行度下降或 NUMA 不均衡。
要实现“每个工作进程独占 N 个核心”的语义(即软性资源隔离),关键在于两点:
- 控制总进程数,确保 总核心数 ≥ 进程数 × N;
- 在子进程中显式绑定 CPU 亲和性(CPU affinity),防止 OS 调度器跨核迁移。
✅ 正确做法示例(推荐使用 psutil + multiprocessing.Pool 初始化):
import multiprocessing as mp
import psutil
import os
def worker_init(n_cores_per_worker: int):
"""子进程初始化:绑定当前进程到 n_cores_per_worker 个空闲核心"""
# 获取所有逻辑核心索引
all_cores = list(range(psutil.cpu_count(logical=True)))
# 简单策略:按进程 ID 分片(需配合固定进程数)
pid = os.getpid()
core_start = (pid % (len(all_cores) // n_cores_per_worker)) * n_cores_per_worker
assigned_cores = all_cores[core_start : core_start + n_cores_per_worker]
# 绑定(仅 Linux/macOS;Windows 需用其他方式如 job objects)
try:
psutil.Process().cpu_affinity(assigned_cores)
except (NotImplementedError, AttributeError):
pass # Windows 不支持或未安装 psutil
def func(x):
return x ** 2
if __name__ == "__main__":
TOTAL_CORES = psutil.cpu_count(logical=True) # 例如 16
N_CORES_PER_PROCESS = 2
RESERVED_CORES = 2 # 为主进程等预留核心(可设为 0)
# 安全计算最大工作进程数:向下取整,避免超订
max_workers = max(1, (TOTAL_CORES - RESERVED_CORES) // N_CORES_PER_PROCESS)
with mp.Pool(
processes=max_workers,
initializer=worker_init,
initargs=(N_CORES_PER_PROCESS,)
) as pool:
results = pool.map(func, range(10000))
print(f"Using {max_workers} workers, each bound to {N_CORES_PER_PROCESS} cores.")⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- cpu_affinity() 仅在 Linux/macOS 且 psutil ≥ 5.7.0 下可靠生效;Windows 上需借助 win32process.SetProcessAffinityMask(需 pywin32)或进程组管理。
- 绑定核心前建议调用 psutil.cpu_count(logical=False) 获取物理核心数,避免超线程干扰(尤其对 CPU 密集型任务)。
- 若任务本身是 Python 多线程(如含 threading 或 concurrent.futures.ThreadPoolExecutor),需额外注意 GIL 与线程调度冲突,此时更推荐纯进程级隔离。
- multiprocessing.Pool 不提供原生“N 核/进程”接口,所谓 cool_new_pool 是概念抽象,真实工程中应通过组合控制(进程数 + 亲和性 + 资源预估)达成目标。
? 总结:没有银弹,但有稳健解法。核心逻辑是——用数学约束进程数,用系统调用约束调度行为。只要明确硬件资源边界、预留余量、并在子进程启动时固化 CPU 亲和性,即可在 Python 生态中高效模拟“N 核每进程”的并行模型。










