在Python中,您可以创建新的线程和进程来运行给定的任务multiprocessing.Pool
, multiprocessing.ThreadPool
, concurrent.futures.ProcessPoolExecutor
, and concurrent.futures.ThreadPoolExecutor
.
默认情况下,这些线程/进程以其父进程相同的 CPU 核心关联性运行,即所有可用核心/线程。
在 Linux/Unix 系统上,可以使用以下命令更改 CPU 核心关联性os.sched_setaffinity(pid, mask)
。问题是这仅限于某些 Linux/Unix 系统。
有的是psutil
python 库公开了设置 CPU 核心关联性的能力psutil.Process().cpu_affinity(CPUS)
where CPUS
是一个整数列表,标识进程应使用哪些 CPU 核心/线程,从 0 开始。
问题在于,通常操作系统 CPU 调度程序可以处理给定进程应使用哪个核心/线程的挑选和选择,而不是让最终用户决定使用哪些 CPU 核心/线程。
我的问题是是否可以创建线程/进程池并限制每个实例使用 X 个 CPU 核心/线程,但不限制它们的确切核心关联性?
例如,如果我有16核的PC并想创建4个进程,我可以创建一个multiprocessing.Pool(processes=4)
目的。现在,如果我希望这 4 个子进程中的每一个都被限制为仅使用 2 个 CPU 核心,我将不得不使用psutil
抢先选择 2 个 CPU 核心并将它们分配给该进程,从可用的 CPU 核心列表中删除这 2 个 CPU 核心,并对所有 4 个进程重复该过程。
但这并不理想,如果我给一个进程提供系统中两个最弱的核心会怎么样?或者,如果这 2 个核心在物理上距离较远(例如现代多芯片 AMD Ryzen CPU 或双 CPU 插槽系统的情况)。
我想让操作系统自动为每个进程调度 2 个核心,并根据需要调整它们,而不必为每个进程手动设置和取消设置 CPU 核心。
有没有办法在 Python 中完成这个任务?